Leetcode 33. Search in Rotated Sorted Array 笔记

158 阅读1分钟

Medium

思路

  • logn的时间复杂度,就要用binary search
  • 二分法找到array里最小的那个值得的点就是我们要找的pivot point
  • 在二分法找target

过程

  • 第一次二分法
  • mid = l + ( r - l ) / 2
  • 如果 num[mid] > num[r], 说明不正常,因为正常的sorted array应该是左边小右边大,说明pivot point(最小值)在mid的右侧。缩小范围,将l右移,l=mid + 1;
  • 如果num[mid] <= num[r], 说明正常,最小值还在mid的左侧(包含mid),于是将r左移,r = mid;
  • 第一次结束,l值为所求的pivot
  • 根据target的值判断在哪一侧执行二分法找target

代码

class Solution {
    public int search(int[] nums, int target) {
        if(nums.length == 0) return -1;
        
        int l = 0, r = nums.length - 1;
        while(l < r){
            int mid = l + (r - l) / 2;
            if(nums[mid] > nums[r]){
                l = mid + 1;
            }else{
                r = mid;
            }
        }
        
        
        int s = l;
        l = 0;
        r = nums.length - 1;
        if(target >= nums[s] && target <= nums[r]){
            l = s;
            r = nums.length - 1;
        }else{
            l = 0;
            r = s - 1;
        }
        
        while(l <= r){
            int mid = l + (r - l)/2;
            if(nums[mid] == target)
                return mid;
            else if(nums[mid] < target){
                l = mid + 1;
            }else{
                r = mid - 1;
            }
        }
        return -1;
    }
}