二分法判断哪边有序,哪边有序就固定哪一边并且移动另一边的指针,每次移动一格。对于无序的一边,每次移动一格进行检查。
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;
}
};
京公网安备 11010502036488号