33. Search in Rotated Sorted Array

来源:互联网 发布:电脑弹钢琴软件 编辑:程序博客网 时间:2024/06/04 18:27

Suppose a sorted array is rotated at some pivot unknown to you beforehand.

(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).

You are given a target value to search. If found in the array return its index, otherwise return -1.

You may assume no duplicate exists in the array.

思路:
首先,可以第一句先考虑nums为空的情况,这时候可以直接返回-1。不过,也可以不考虑这种情况,而直接在程序最后当程序中间的return语句没有被执行,就最后return -1.

然后,我们想到这道题可以采用Binary Search的思路。返回条件是:if(nums[mid] == target) return mid;Binary Search具体是分为两层:第一层考虑first到mid这一段是否是sorted。第二层是如果first到mid这一段是sorted,那么再继续考虑target是否在first到mid这一段当中,如果在,就把mid赋给last,如果不在,就把mid + 1赋给first。如果first到mid这一段不是sorted,那么也跟前面类似地考虑target是否在mid到last - 1这一段当中,如果在就把mid + 1赋给first,如果不在,就把mid赋给last。这样就完成了Binary Search的每次折半搜索。最后,加一句返回语句,return -1.

代码如下:

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

Time : O(lgn)
Space: O(1)
相关题目。

0 0