题解 | #在旋转过的有序数组中寻找目标值#

在旋转过的有序数组中寻找目标值

http://www.nowcoder.com/practice/87c0e7abcbda41e7963660fa7d020995

C++版本---
如若有错误的或者可以改进的地方,欢迎指正、交流

// NC48在旋转过的有序数组中寻找目标值--
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @param target int整型 
     * @return int整型
     */
    int search(vector<int>& nums, int target) {
        // write code here
/*          思路:
            将target和左 、中 、右 3个位置的值进行比对,以确定继续查找的区间
            其实就是判断以中点划分的左右区间是否有序
            因为旋转的那部分可长可短,中点可能在有序的那段,也可能跨段了,且肯定有一段有序
            如果 nums[mid]=target,返回
            如果 nums[left] <= nums[mid]  && nums[left] <= target < nums[mid]  那么接下来左边找 ,如果不是这样就是在右边
            如果 nums[mid] < nums[right]  && nums[mid] < target <=nums[right]  那么接下来右边找,反之左边
        注意点:
            1、nums[left] <= nums[mid] 要等号,比如只有两个数据的时候,nums[left]==nums[mid];此时如果不是左边这个,就找右边的
            2、nums[left] <= target < nums[mid] 左边取等号,查找的数可能位于最左边,最终mid=left
            3、nums[mid] < target <=nums[right] 右边取等号,查找的数可能位于最左边,最终mid=right

 */        int len=nums.size();
        if(len==0) return -1;
        int left=0,right=len-1;

        while(left<=right){
            int mid=left+(right-left)/2;
            if(nums[mid]==target) return mid;
            // 看左边这段是否连续,要么连续,要么不连续
            //如果左边有序
            if(nums[left]<=nums[mid] ){
                if( nums[left]<= target && target < nums[mid]){
                    // 目标值在左边区间
                    right=mid-1;
                }else{
                    //如果不在左边,就去右边找
                    left=mid+1;
                }
            }else{
                //如果左边这段不连续,也就是nums[left]>nums[mid],那么右边肯定连续
                //先看目标值是否在右边
                if(nums[mid]<target && target <= nums[right]){
                    // 如果在右边
                    left=mid+1;
                }else{
                    //如果在左边
                    right=mid-1;
                }
            }    
        }
        return -1;
    }
};
全部评论

相关推荐

Pandaileee:校友加油我现在也只有一个保底太难了
点赞 评论 收藏
分享
一颗宏心:华为HR晚上过了十二点后还给我法消息。
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务