【Leetcode】33. Search in Rotated Sorted Array

问题描述:

  二分查找,有序翻转后的数组上进行查找 ,返回下标。

问题分析:

  这题关键在于找到一个性质,就是如果这个数组确实被翻转过,那么 一定有a[0] > a[n],所以根据这个条件来判断,当前l r 是否在单调区间上。

问题解决:

  首先判断target所在区间,然后判断m所在区间,最后先将l 或者 r 往target区间上靠, 然后把m往target上靠。

代码如下:

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int l = 0, r = nums.size() - 1, m;
        while(l <= r){
            m = (l + r)>>1;
            if(nums[m] == target)
                return m;
            if(nums[l] <= nums[r]){
                if(nums[m] < target)
                    l = m + 1;
                else
                    r = m - 1;
            }else{
                if(target >= nums[l]){//target在左侧区间
                    if(nums[m] < nums[r])//m在右侧区间
                        r = m - 1;//让m 左移
                    else{// m在左侧区间
                        if(nums[m] > target) 
                            r = m - 1;
                        else 
                            l = m + 1;
                    }
                } 
                else{//target在右侧区间
                    if(nums[m] > nums[r])//m在左侧区间
                        l = m + 1;//让m 右移
                    else{//m在右侧区间
                        if(nums[m] > target) 
                            r = m - 1;
                        else 
                            l = m + 1;
                    }
                }
                  
            }
        }
        return  -1;
    }
};

 

posted on 2016-04-19 14:57  暴力的轮胎  阅读(197)  评论(0编辑  收藏  举报

导航