今天做了一道演算法題,尋找旋轉排序陣列中的最小值,就是將原來公升序的陣列,以某個點截斷,然後交換這兩段,構成新的陣列,使用二分法在這個新陣列中找最小值,這道題開始想的複雜了,認為這個輸入陣列有4中形況:1、公升序排列,2、降序排列,3、先公升再降,4、先降再公升,然後洋洋灑灑的寫了下面的**:
int findmin(vector&nums)
else if (nums[low] < nums[mid] && nums[mid] > nums[high])
else if (nums[low] > nums[mid] && nums[mid] < nums[high])
else
}return nums[low];}
後來看了網上的乙個部落格,發現思路想複雜了(看來看問題,不同角度很關鍵,這也決定了你以後做事情,如果一開始就把看事情的角度想歪了,那真的是會浪費大量的時間和精力,但是如果一旦你有這樣的思維習慣,那麼沒關係,多總結,分析,把這種冗長的思維習慣改過來,慢慢的練習)
現在想想,可以這麼看問題,有序的陣列是【1,2,...i, i+1, ...,n】,轉換之後,無非是找了乙個點,然後旋轉兩段子陣列,得到
【i+1, ...,n,1,....i】,其實反覆想這個問題,是十分簡單的,非常非常簡單,但是就是一瞬間,你能否找對角度來看這個問題。
**如下:
int findmin(vector&nums)
return nums[low];}
而且還要記住,在採用二分查詢的演算法中,low和high在每一次迴圈中,都要變化,否則**就進入死迴圈,程度便無法退出。
尋找旋轉排序陣列中的最小值
假設乙個旋轉排序的陣列其起始位置是未知的 比如0 1 2 4 5 6 7 可能變成是4 5 6 7 0 1 2 你需要找到其中最小的元素。你可以假設陣列中不存在重複的元素。public class solution else if num mid 如果陣列中可能存在重複的元素。那麼上面的方法就不能使...
尋找旋轉排序陣列中的最小值
假設乙個旋轉排序的陣列其起始位置是未知的 比如0 1 2 4 5 6 7 可能變成是4 5 6 7 0 1 2 你需要找到其中最小的元素。你可以假設陣列中不存在重複的元素。解題思路 陣列中不存在重複的元素 二分法的思想,首先判斷最左邊和最右邊的關係,如果小於就直接返回 如果中間的值大於等於最左邊的值...
尋找旋轉排序陣列中的最小值
假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。例如,陣列 0,1,2,4,5,6,7 可能變為 4,5,6,7,0,1,2 請找出其中最小的元素。注意陣列中可能存在重複的元素。示例 1 輸入 1,3,5 輸出 1class solution public int findmin1 int ...