二分的流程:
1.確定二分的邊界
2.編寫二分的代碼框架
3.設計一個check(性質)
4.判斷一下區間如何更新
5.如果更新方式時l=mid,r=mid+1,那麼在算mid的時候加1
69.x的平方根
#include<iostream>
using namespace std;
int mySqrt(int x)
{
int l = 0,r = x;
while(l<r)
{
int mid = l+(long long)r+1 >>1; //long long防止r=x的時候溢出
if(mid <= x/mid) //mid*mid <= x
l = mid;
else
r = mid-1;
}
return l;
}
int main()
{
int x;
cin>>x;
int a = mySqrt(x);
cout<<a<<endl;
return 0;
}
35. 搜索插入位置
int searchInsert(vector<int>& nums, int target)
{
if(nums.empty() || nums.back() < target)
return nums.size();
int l = 0,r = nums.size();
while(l<r)
{
int mid = l+r>>1;
if(nums[mid] >target)
r = mid;
else
l = mid+1;
}
return r;
}
34. 在排序數組中查找元素的第一個和最後一個位置
vector<int> searchRange(vector<int>& nums, int target)
{
if(nums.empty())
return {-1,-1};
int l = 0,r = nums.size() - 1;
while(l<r)
{
int mid = l+r >>1;
if(nums[mid] >= target)
r = mid;
else
l = mid+1;
}
if(nums[r] != target)
return {-1,-1};
int start = r; //左邊第一個找到的數
l=0,r=nums.size()-1;
while(l<r)
{
int mid = l+r+1>>1;
if(nums[mid] <= target)
l = mid;
else
r = mid-1;
}
int end = r; //右邊的最後一個數
return {start,end};
}
74. 搜索二維矩陣
bool searchMatrix(vector<vector<int>>& matrix, int target)
{
if(matrix.empty() || matrix[0].empty()) //判空
return false;
int m = matrix.size(),n=matrix[0].size(); //m表示行數,n表示列數
int l = 0,r = m*n -1;
while(l<r)
{
int mid = l+r>>1;
if(matrix[mid/n][mid%n] >= target) //mid/n求行數,mid%n求列數 //注意是對列除和取餘
r = mid;
else
l = mid+1;
}
if(matrix[r/n][r%n] != target) //找到的值和目標值不等返回false
return false;
else
return true;
}
153. 尋找旋轉排序數組中的最小值
int findMin(vector<int>& nums)
{
int l =0,r = nums.size()-1;
while(l<r)
{
int mid = l+r>>1;
if(nums[mid] <= nums.back()) //nums.back() 去nums中的最後一個元素
r = mid;
else
l =mid + 1;
}
return nums[r];
}
33.搜索旋轉排序數組
int search(vector<int>& nums, int target)
{
if(nums.empty())
return -1;
//扎到最小值
int l = 0,r = nums.size()-1;
while(l<r)
{
int mid = l+r>>1;
if(nums[mid] <= nums.back())
r = mid;
else
l = mid+1;
}
if(target <= nums.back())
r = nums.size()-1;
else
l = 0,r--;
while(l<r)
{
int mid = l+r>>1;
if(nums[mid] >= target)
r = mid;
else
l = mid+1;
}
if(nums[l] == target) //只能是l不能是r,邊界問題
return l;
else
return -1;
}