尋找旋轉排序陣列中的最小值 II

2021-10-02 03:00:30 字數 1498 閱讀 1542

假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。( 例如,陣列 [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 說明 這道題是 尋找...