leetcode 33 Search in Rotated Sorted Array (c++)

记录一下思路:
时间复杂度要求log n,所以二分查找。
总是对二分的左右指针小于等于或者小于有疑惑。
思考过程:
1、要二分查找,首先要找到是在左侧查找还是右侧查找。
2、因为是循环数组,所以有一定规律。必然有一侧的是递增序列。
3、在递增序列中可以比较target是否在递增序列中。
4、如果在就继续普通二分,不在就在另一侧找递增序列。
5、最后剩余2-3个数,考虑一下小于等于。
重点:
1、mid数都是数组中间数(size=奇数)或者中间数-1位置(size=偶数)
1、考虑是否递增的时候,mid数应该是分别加入左侧和右侧,然后再考虑左侧和右侧是否递增。这样[3,1],mid=0情况下,左侧[3]是递增数组,右侧[3,1]是非递增。这样思考可以解决等号问题。
3、判断时nums[mid]大于等于或小于等于nums[left] or nums[right],因为target有可能在边界。
4、while(left <= right)需要等号,否则会提前终止,返回-1.
5、其实只分为递增和非递增两部分,非递增包括递减和一个数的情况。

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int len_nums = nums.size();
        int left = 0;
        int right = len_nums - 1;
        while(left <= right){
            int mid = (left + right) / 2;
            if (nums[mid] == target) return mid;
            if (nums[mid] >= nums[left]){
                if (target < nums[mid] && target >= nums[left])
                {right = mid - 1;
            }else{
                left = mid + 1;
            }
            }else{
            if (target > nums[mid] && target <= nums[right]){
                left = mid + 1;
            }else{
                right = mid - 1;
            }
            }
        }
        return -1;
    }
};

悄悄的,在B造轮子很忙,博客没什么时间更新,再努力5个月,加油。

你可能感兴趣的:(leetcode)