力扣------二分查找

二分的流程:

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; 
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章