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

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

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

二分法判断哪边有序,哪边有序就固定哪一边并且移动另一边的指针,每次移动一格。对于无序的一边,每次移动一格进行检查。

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @param target int整型 
     * @return int整型
     */
    int search(vector<int>& nums, int target) {
        // write code here

        int left = 0;
        int right = nums.size() - 1;

        while(left < right)
        {
            int mid = (left+right)/2;

            //如果已经找到了这个数;
            if(nums[mid] == target)
            {
                return mid;
            }else
            {
                //没有找到这个数则判断左/右哪个是有序的;
                if(nums[left] <= nums[mid])
                {
                    //左边有序;
                    if(nums[left] < target && target <= nums[mid])
                    {
                        //单调区间内查找;
                        right = mid - 1;
                    }else
                    {
                        //无序区间查找;
                        left = mid + 1;
                    }
                }else
                {
                    //否则右边有序;
                    //单调区间内查找;
                    if(nums[mid] < target && target<=nums[right])
                    {
                        left = mid + 1;
                    }else
                    {
                        //无序区间内查找;
                        right = mid - 1;
                    }
                }
            }
        }

        if(nums[left] == target)
            return left;

        return -1;
    }
};
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务