leetcode 33 搜索旋转排序数组

 将原本按顺序的数组旋转后进行查找,其实只需要进行正常的二分查找,对计算出的mid值进行一定的处理,就能够得到相应的结果,贴代码

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

还有些很好的想法,第一个,通过找到分界点,得到两个分别有序的数组,进行二分查找。另外一个,直接进行二分,其中一个一定是有序的,另外一个可能有序可能无序,对有序的数组进行二分查找,然后对另外一个继续二分,其中一个是有序的,一个是有可能有序有可能无序的。二分查找的边界条件确实很难处理。贴代码

 1 class Solution {
 2 public:
 3     int search(vector<int>& nums, int target) 
 4     {
 5         int n = nums.size();
 6         int l = 0;
 7         int r = n-1;
 8         int mid;
 9         while(l<=r)
10         {
11             mid = (l+r)/2;
12             if(target == nums[mid])
13             return mid;
14             if(nums[l]<= nums[mid])
15             {
16                 if(target<nums[mid] && target>=nums[l])
17                 {
18                     r = mid;
19                 }
20                 else
21                 {
22                     l = mid+1;
23                 }
24             }
25             else
26             {
27                 if(target<=nums[r] && target>nums[mid])
28                 {
29                     l = mid+1;
30                 }
31                 else
32                 {
33                     r = mid;
34                 }
35             }
36         }
37         return -1;
38     }
39 };

 

上一篇:清易JL-33 多参数手持式气象站携手持式气象站,随时掌握天气情况


下一篇:win10的docker无法运行mysql的image,Public Key Retrieval is not allowed