二分的流程:
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;
}