题解 | #在旋转过的有序数组中寻找目标值#
在旋转过的有序数组中寻找目标值
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; } };