假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。( 例如,陣列 [0,1,2,4,5,6,7] 可能變為 [4,5,6,7,0,1,2] )。請找出其中最小的元素。注意陣列中可能存在重複的元素。
示例 1:
示例 2:
1.旋轉排序陣列 nums 可以被拆分為 2 個排序陣列 nums1, nums2 ,並且 nums1任一元素 >= nums2任一元素;因此,考慮二分法尋找此兩陣列的分界點 nums[i] (即第 2 個陣列的首個元素)。
2.設定 left, right 指標在 nums 陣列兩端,mid 為每次二分的中點:
(1)當 nums[mid] > nums[right]時,mid 一定在第 1 個排序陣列中,i 一定滿足 mid < i <= right,因此執行 left = mid + 1。
(2)當 nums[mid] < nums[right] 時,mid 一定在第 2 個排序陣列中,i 一定滿足 left < i <= mid,因此執行 right = mid;
(3)當 num
s[mi
d]==
nums
[rig
ht
]nums[mid] == nums[right]
nums[m
id]=
=num
s[ri
ght]
時,此題中陣列的元素可重複,難以判斷分界點 i 指標區間:
1)例如[1,0,1,1,1] 和 [1,1,1,0,1] ,在 left = 0, right = 4, mid = 2 時,無法判斷 mid 在哪個排序陣列中。
2)我們採用 right = right - 1 解決此問題,證明:
此操作不會使陣列越界:因為迭代條件保證了 right > left >= 0;
此操作不會使最小值丟失:假設 nums[right] 是最小值,有兩種情況:
若 nums[right] 是唯一最小值:那就不可能滿足判斷條件 num
s[mi
d]==
nums
[rig
ht
]nums[mid] == nums[right]
nums[m
id]=
=num
s[ri
ght]
,因為 mid < right(left != right 且 mid = (left + right) // 2 向下取整);
若 nums[right] 不是唯一最小值,由於 mid < right 而 nums[mid] == nums[right],即還有最小值存在於 [left, right - 1]區間,因此不會丟失最小值。
class
solution
else
if(nums[mid]
< nums[end]
)else
}return nums[begin];}
};
時間複雜度:o(n)
空間複雜度:o(1)
尋找旋轉排序陣列中的最小值 II
題目 假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。例如,陣列 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思路1 直接遍曆法,...
尋找旋轉排序陣列中的最小值 II
154.尋找旋轉排序陣列中的最小值 ii 假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。例如,陣列 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...
154尋找旋轉排序陣列中的最小值 II
題目描述 假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。例如,陣列 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 說明 這道題是 尋找...