二分查找 2022/3/28

//二分查找
//二分查找1.最左边的第一位
//二分查找2.最右边的第一位
#include <iostream>
#include <vector>
using namespace std;

//最基本的二分查找无法确定找到的是哪一个最先找到的输出
int FristBinarySearch(vector<int> nums,int target){
	int left=0,right=nums.size()-1;
	int mid=0;
	while(left<=right){
		mid=left+(right-left)/2;
		if(nums[mid]<target) left=mid+1;
		else right=mid-1;
	}
	if(nums[left]!=target||left==nums.size()) return -1;//主要是先后顺序,否则找不到值 
	return left;
}

//给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。
//如果目标值不存在于数组中,返回它将会被按顺序插入的位置
int searchInsert(vector<int>& nums, int target) {
    int left=0,right=nums.size()-1;
    while(left<=right)
    {
        int mid=left+((right-left)>>1);
        if(target>nums[mid]) left=mid+1;
        else right=mid-1;
    }
    //返回做的意义就是满足左界变化的相反条件的第一个位置
    //target>nums[mid]相反就是第一个nums[mid]大于等于target的下标位置
    return left;
}


//求峰值且左右已排序arr[0] < arr[1] < ... arr[i - 1] < arr[i] > arr[i + 1] > ... > arr[arr.length - 1]
    int peakIndexInMountainArray(vector<int>& arr) {
        int left=0,right=arr.size()-1;
        while(left<=right)
        {
            int mid=left+((right-left)>>1);
            if(arr[mid]<arr[mid+1]) left=mid+1;
            else right=mid-1;
        }
        //返回做的意义就是满足左界变化的相反条件的第一个位置
        //arr[mid]<arr[mid+1]相反就是第一个arr[mid]大于等于arr[mid+1]的下标位置
        return left;
    }


//二分查找4.大于等于的第一位
int bigandequ(vector<int> nums,int target){
	int left=0,right=nums.size()-1;
	int mid=0;
	while(left<=right){
		mid=left+(right-left)/2;
		if(nums[mid]<target) left=mid+1;
		else right=mid-1;
	}
	if(left==nums.size()) return -1;//主要是先后顺序,否则找不到值 
    //返回做的意义就是满足左界变化的相反条件的第一个位置
    //target>nums[mid]相反就是第一个nums[mid]大于等于target的下标位置
	return left;
}

int Lastbigandequ(vector<int> nums,int target){
	int left=0,right=nums.size()-1;
	int mid=0;
	while(left<=right){
		mid=left+(right-left)/2;
		if(nums[mid]>target) right=mid-1;
		else left=mid+1;
	}
    //返回做的意义就是满足右界变化的相反条件的最后一个位置
    //target<nums[mid]相反就是最后一个nums[mid]小于等于target的下标位置
	return right;
}

int LastBinarySearch(vector<int> nums,int target){
	int left=0,right=nums.size()-1;
	int mid=0;
	while(left<=right){
		mid=left+(right-left)/2;
		if(nums[mid]>target) right=mid-1;
		else left=mid+1;
	}
	if(right<0||nums[right]!=target) return-1;
	return right;
}

int BinarySearch(vector<int> nums,int target){
	int left=0,right=nums.size()-1;
	int mid=0;
	while(left<=right){
		mid=left+(right-left)/2;
		if(nums[mid]==target) return mid;
		else if(nums[mid]>target) right=mid-1;
		else left=mid+1;
	}
	return -1;
}
int main(){
	int a = FristBinarySearch({1,2,3,3,3},9);
	int b = LastBinarySearch({1,2,3,3,3},3);
	int c = BinarySearch({1,2,3,3,3,4,4},3);
	int d = bigandequ({1,2,4,4,4,4,4},3);
	int e = Lastbigandequ({1,2,2,2,2,4,4,4,4,4},3);
	cout<<a<<endl<<b<<endl<<c<<endl<<d<<endl<<e;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值