leetcode - 154 尋找旋轉排序陣列中的最小值Ⅱ
阿新 • • 發佈:2018-11-19
假設按照升序排序的陣列在預先未知的某個點上進行了旋轉。
( 例如,陣列 [0,1,2,4,5,6,7]
可能變為 [4,5,6,7,0,1,2]
)。
請找出其中最小的元素。
注意陣列中可能存在重複的元素。
示例 1: 輸入: [1,3,5] 輸出: 1
示例 2: 輸入: [2,2,2,0,1] 輸出: 0
思路:
{2, 2, 2, 2, 2, 2, 2, 2, 0, 1, 1, 2} 和 {2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2}, 我們發現,當第一個數字和最後一個數字,還有中間那個數字全部相等的時候,二分查詢法就崩潰了,因為它無法判斷到底該去左半邊還是右半邊。這種情況下,我們將左指標右移一位,略過一個相同數字,這對結果不會產生影響,因為我們只是去掉了一個相同的,然後對剩餘的部分繼續用二分查詢法,在最壞的情況下,比如陣列所有元素都相同,時間複雜度會升到O(n)。
public int findMin(int[] nums) { int left = 0; int right = nums.length - 1; int mid = 0; while(nums[left] >= nums[right]){ if(right - left == 1){ mid = right; break; } mid = left + (right - left) / 2; if(nums[mid] == nums[left] && nums[mid] == nums[right]){ int result = nums[left]; for(int i = left + 1; i <= right; i++){ if(result > nums[i]){ result = nums[i]; } } return result; } if(nums[mid] <= nums[right]) right = mid; if(nums[mid] >= nums[left]) left = mid; } return nums[mid]; }