1. 最基本的二分查找算法:
在已排好序的vector中查找是否存在target
bool findData(vector<int> &nums, int target){
if(nums.size()==0)
return false;
int low=0;
int high=nums.size()-1;
int mid;
while(low<=high){
mid=(low+high)>>1;
if(nums[mid]==target)
return true;
else if(nums[mid]<target){
low=mid+1;
}
else{
high=mid-1;
}
}
return false;
}
2. 将已排好序的数组转动后,找出最小节点:
假设数组中不存在重复元素
int findMin(vector<int>& nums) {
int len=nums.size();
if(len==1)
return nums[0];
if(nums[0]<nums[len-1])
return nums[0];
int low=0, high=len-1, mid;
while(low<high){
mid=(low+high)>>1;
if(high-low==1)
break;
if(nums[mid]>nums[low])
low=mid;
else if(nums[mid]<nums[high])
high=mid;
}
return nums[high];
}
假设数组中存在相同元素
int findMin(vector<int>& nums) {
int len=nums.size();
if(len==1)
return nums[0];
if(nums[0]<nums[len-1])
return nums[0];
int low=0, high=len-1, mid;
while(low<high){
mid=(low+high)>>1;
if(high-low==1)
break;
if(nums[mid]>nums[low]){//这里主要需要考虑这种情况:10, 1, 10, 10, 10
if(nums[low]<nums[high])
high=mid;
else
low=mid;
}
else if(nums[mid]<nums[high]){
high=mid;
}
else
low++;
}
return min(nums[high], nums[low]);
}
3. 将排好序的数组移动后,在其中查找target元素
数组中不存在重复元素
int search(vector<int>& nums, int target) {
int len=nums.size();
if(len==0)
return -1;
int low=0;
int high=len-1;
int mid;
while(low<=high){
mid=(low+high)>>1;
if(nums[mid]==target)
return mid;
else if(nums[mid]>=nums[low]){//两次都是跟nums[low]比较
if(target<nums[mid] && target>=nums[low])
high=mid-1;
else
low=mid+1;
}
else if(nums[mid]<nums[low]){
if(target>nums[mid] && target<=nums[high])
low=mid+1;
else
high=mid-1;
}
}
return -1;
}
如果数组中存在相同元素
bool search(vector<int>& nums, int target) {
if(nums.size()==0)
return false;
int low=0;
int high=nums.size()-1;
int mid;
while(low<=high){
mid=(low+high)>>1;
if(nums[mid]==target)
return true;
if(nums[mid]>nums[low]){
if(target<nums[mid]&&target>=nums[low])
high=mid-1;
else
low=mid+1;
}
else if(nums[mid]<nums[low]){
if(target>nums[mid]&&target<=nums[high])
low=mid+1;
else
high=mid-1;
}
else//根以上解法的唯一差别
low++;
}
return false;
}