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

二分的流程:

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

 

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