81. Search in Rotated Sorted Array II

130 阅读1分钟

81. Search in Rotated Sorted Array II

这题比较难的点其实在于数组中存在相同的值,因此需要做一个额外的判断。

  1. 如果nums[mid] > nums[left],那么我们就能知道left~mid是单调递增的,因此我们可以通过判定target是否在这个区间来缩小查找区间。

  2. 如果nums[mid] < nums[left],那么mid~right这个区间是非递增的单调区间,同理去判定target是否在这个区间。

  3. 那么如果nums[left] == nums[mid]呢,这个时候就存在两种情况,左右都可能是单调递增区间的,比如[1,3,3,3,3,3, 4],我们既可以变成[3,4,1,3,3,3,3],也可以是[3,3,4,1,3,3,3],这个时候我们只知道left是不符合题意的,因此left增加一位。

func search(_ nums: [Int], _ target: Int) -> Bool {
    var left = 0, right = nums.count - 1
    while left <= right {
        let mid = (left + right) / 2
        if nums[mid] == target {
            return true
        }
        if nums[mid] > nums[left] {
            if nums[mid] > target && target >= nums[left] {
                right = mid - 1
            } else {
                left = mid + 1
            }
        } else if nums[mid] < nums[left] {
            if nums[mid] < target && target <= nums[right] {
                left = mid + 1
            } else {
                right = mid - 1
            }
        } else {
            left += 1
        }
    }
    return false
}