LeetCode Search in Rotated Sorted Array

来源:互联网 发布:淘宝卖家退款多久到账 编辑:程序博客网 时间:2024/06/06 02:17

Suppose an array sorted in ascending order 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.


思路一:先顺序遍历找到pivot,如果没有找到满足target的值,那么在对剩下的升序序列使用二分搜索

代码如下:

class Solution {public:    int search(vector<int>& nums, int target) {        int len = nums.size();        int front,end,middle;        end = len-1;front=0;        for(int i=0;i<len-1;i++)        {             if(target == nums[i])                return i;            if(nums[i]>nums[i+1])            {                front = i+1;                break;            }        }                        while(front<=end)        {            middle = (front+end)/2;            if(nums[middle]>target)            {                end = middle-1;            }            else if(nums[middle] < target)            {                front = middle+1;            }            else            {                return middle;            }        }        return -1;    }};


运行的时候效率不是很稳定


思路二:整个过程都使用二分搜索法

代码如下:

class Solution {public:    int search(vector<int>& nums, int target) {        int len = nums.size();        int flag = nums[len-1];        int front,end,middle;        end = len-1;front=0;                while(front<end)        {           middle = (front+end)/2;           if(nums[middle] <= nums[end])           {               if(target > nums[middle] && target <= nums[end])                    front = middle+1;               else                    end = middle;                               }           else           {               if(target <= nums[middle] && target >= nums[front])                   end = middle;               else                   front = middle+1;           }        }        if(nums[front]==target)            return front;        return -1;    }};

思路三:求出那个pivot的位置,然后就可以将每个middle转换为原先没有rotated的数组中对应的位置

代码如下:

class Solution {public:    int search(vector<int>& nums, int target) {        int len = nums.size();        int front,end,middle;        end = len-1;front=0;        while(front<end)        {            middle = (front+end)/2;            if(nums[middle] == target)                return middle;            if(nums[middle] > nums[end])                front = middle+1;            else                end = middle;        }                int smallest = front;        front = 0;end = len-1;        while(front<=end)        {            middle = (front+end)/2;            int realmiddle = (middle+smallest)%len;            if(nums[realmiddle]>target)            {                end = middle-1;            }            else if(nums[realmiddle] < target)            {                front = middle+1;            }            else            {                return realmiddle;            }        }        return -1;    }};



0 0
原创粉丝点击