Leetcode专题[数组]-33-搜索旋转排序数组

力扣链接:https://leetcode-cn.com/probl...
解题思路:

  1. 题目要求设计一个O(logn)时间复杂度的算法,数组+O(logn)基本上可以确定是使用二分法来解决
  2. 对旋转后的数组进行分析,找规律,可以发现,选定一个数字,将数组分成前后两个部分,其中一个部分必定是有序的
  3. 使用二分法,先从中位数开始找,最重要的是左右边界的收缩,根据trget所处的位置进行收缩即可
  4. 确定中位数字之后,我们需要判定有序区间,因为只有在有序区间里面我们才方便比较数字在不在里面
    (1)如果mid的左半边有序,那么很容易就可以判定target是不是在左半边,如果在,high = mid -1;如果不在,low := mid +1
    (2)如果mid的右半边有序,那么很容易就可以判定在不在右半边,如果在那么low = mid + 1,如果不在那么high = mid -1
    (3)需要注意的是low和high的取值,因为有可能这个数字在数组的第一个位置,那么high和low是有可能想等的,同时mid也有可能是和low及high想等的,边界条件判断需要清晰
func search(nums []int, target int) int {
    n := len(nums)
    low, high := 0, n - 1
    for low <= high {
        mid := (high - low) >> 1 + low
        if nums[mid] == target {
            return mid
        }
        if nums[low] <= nums[mid] { // 左半边有序
            if nums[low] <= target && target < nums[mid] {
                high = mid - 1
            } else {
                low = mid +1
            }
        } else { // 右半边有序
            if nums[mid] < target && target <= nums[high] {
                low = mid + 1
            } else {
                high = mid -1
            }
        }
    }
    return -1
}

你可能感兴趣的:(golang)