各种二分查找算法总结

1. 最基本的二分查找算法:

在已排好序的vector中查找是否存在target

bool findData(vector<int> &nums, int target){
	if(nums.size()==0)
		return false;
	int low=0;
	int high=nums.size()-1;
	int mid;
	while(low<=high){
		mid=(low+high)>>1;
		if(nums[mid]==target)
			return true;
		else if(nums[mid]<target){
			low=mid+1;
		}
		else{
			high=mid-1;
		}
	}
	return false;
}

2. 将已排好序的数组转动后,找出最小节点:

假设数组中不存在重复元素

    int findMin(vector<int>& nums) {
        int len=nums.size();
        if(len==1)
            return nums[0];
        if(nums[0]<nums[len-1])
            return nums[0];
            
        int low=0, high=len-1, mid;
        
        while(low<high){
            mid=(low+high)>>1;
            if(high-low==1)
                break;
            if(nums[mid]>nums[low])
                low=mid;
            else if(nums[mid]<nums[high])
                high=mid;
        }
        return nums[high];
    }
假设数组中存在相同元素
    int findMin(vector<int>& nums) {
        int len=nums.size();
        if(len==1)
            return nums[0];
        if(nums[0]<nums[len-1])
            return nums[0];
        
        int low=0, high=len-1, mid;
        while(low<high){
            mid=(low+high)>>1;
            if(high-low==1)
                break;
            if(nums[mid]>nums[low]){//这里主要需要考虑这种情况:10, 1, 10, 10, 10
                if(nums[low]<nums[high])
                    high=mid;
                else
                    low=mid;
            }
            else if(nums[mid]<nums[high]){
                high=mid;
            }
            else 
                low++;
        }
        return min(nums[high], nums[low]);
    }

3. 将排好序的数组移动后,在其中查找target元素

数组中不存在重复元素

    int search(vector<int>& nums, int target) {
        int len=nums.size();
        if(len==0)
            return -1;
        int low=0;
        int high=len-1;
        int mid;
        while(low<=high){
            mid=(low+high)>>1;
            if(nums[mid]==target)
                return mid;
            else if(nums[mid]>=nums[low]){//两次都是跟nums[low]比较
                if(target<nums[mid] && target>=nums[low])
                    high=mid-1;
                else
                    low=mid+1;
            }
            else if(nums[mid]<nums[low]){
                if(target>nums[mid] && target<=nums[high])
                    low=mid+1;
                else
                    high=mid-1;
            }
        }
        return -1;
    }
如果数组中存在相同元素
    bool search(vector<int>& nums, int target) {
        if(nums.size()==0)
            return false;
        int low=0;
        int high=nums.size()-1;
        int mid;
        while(low<=high){
            mid=(low+high)>>1;
            if(nums[mid]==target)
                return true;
            if(nums[mid]>nums[low]){
                if(target<nums[mid]&&target>=nums[low])
                    high=mid-1;
                else
                    low=mid+1;
            }
            else if(nums[mid]<nums[low]){
                if(target>nums[mid]&&target<=nums[high])
                    low=mid+1;
                else
                    high=mid-1;
            }
            else//根以上解法的唯一差别
                low++;
        }
        return false;
    }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值