- tags: LeetCode
思路
这个是 LeetCode: 153.Find Minimum in Rotated Sorted Array 扩展,增加了以下几种边界情况:
- ‘[2, 2, 2, 2, 1]’
- ‘[3, 1, 3]’
- ‘[1, 1, 1]’
- ‘[10, 1, 10, 10, 10]’
但核心依然是判断最小值是在左边还是右边。假设如下数组:
-
‘[3, 3, 3, 1, 3]’
-
left[0]=3, right[4]=3, mid[2]=3, 这时候不确定最小值在哪边但是 right– 是安全的,所以执行 right–
-
left[0]=3, right[3]=1, mid[2]=3, 这时候 mid < right 说明最小值在 mid 的右边,所以调整 left = mid + 1
-
左右两边索引一致终止循环
实现
func findMin(nums []int) int {
length := len(nums)
left, right := 0, length - 1
for left < right {
mid := (left + right) / 2
if nums[mid] > nums[right] {
left = mid + 1
} else if nums[mid] < nums[right] {
right = mid
} else {
right--
}
}
return nums[right]
}