跳转至

LC33 - 搜索旋转排序数组

SearchInRotatedSortedArray.go
package BinarySearch

func search(nums []int, target int) int {
    for l, r := 0, len(nums)-1; l <= r; {
        m := l + (r-l)/2
        if nums[m] == target {
            return m
        }
        if nums[l] <= nums[m] {
            if nums[l] <= target && target < nums[m] {
                r = m - 1
            } else {
                l = m + 1
            }
        } else {
            if nums[m] < target && target <= nums[r] {
                l = m + 1
            } else {
                r = m - 1
            }
        }
    }
    return -1
}

// (1) "有序数组" 属于 "旋转排序数组"
// (2) 对于旋转排序数组[l,r]以及某个划分点m, 必有[l,m]与[m,r]其一是旋转排序数组,其二是有序数组

26 - 27行的两个结论是理解旋转排序数组的关健,LC153 (下一题) 也会用到。