class Solution {
public:
bool binarysearch(vector<int>nums,int key) {
int left = 0, right = nums.size() - 1, cur;
while (left<= right){
cur = (left + right) / 2;
if (nums[cur] == key)
return true;
if (nums[cur] > key)
right = cur-1;
if (nums[cur] < key)
left = cur+1;
}
return false;
}
};
<span style="font-family: 'Microsoft YaHei'; background-color: rgb(255, 255, 255);">人人一面题,由一个有序的数组,有部分被旋转到后面去了,怎么在logn时间内实现查找。</span>
首先复习下二分查找,每次取中间值,key比中间值大则再右边找, 否则在左边找,退出while的条件是left<=right
然后这个题要求logn肯定也是二分查找,二分查找的关键在于在左边找还是在右边找,注意每次取中间值的时候,左右两边肯定有一边是有序的,如果右边是有序的,判断是否在右侧(nums[mid]<key<nums[right]),在的话则往右部分找,不在则往左部分找,如果左边是有序的,判断是否在左侧(nums[left]<key<nums[mid]),在的话则往左部分找,不在则往右部分找。其他都是跟二分查找一致的。
class Solution {
public:
bool binarysearch(vector<int>nums,int key) {
int left = 0, right = nums.size() - 1, mid;
while (left<= right){
mid = (left + right) / 2;
if (nums[mid] == key)
return true;
if (nums[mid] <= nums[right])//右侧是有序的
{
if (key>nums[mid]&&key<nums[right])//在右边
{
left = mid + 1;
}
else//左边
{
right = mid - 1;
}
}
else//左侧有序
{
if (key<nums[mid] && key>nums[left])//在左边
{
right = mid - 1;
}
else//右边
{
left = mid + 1;
}
}
}
return false;
}
};