【LeetCode刷题】专题三:二分查找模板

【LeetCode刷题】Day 11

  • 专题三:二分查找模板:
    • [1. 朴素二分模板:](#1. 朴素二分模板:)
    • [2. 区间左值模板:](#2. 区间左值模板:)
    • [3. 区间右值模板:](#3. 区间右值模板:)
  • [题目1:704. 二分查找](#题目1:704. 二分查找)
  • [题目2:34. 在排序数组中查找元素的第一个和最后一个位置](#题目2:34. 在排序数组中查找元素的第一个和最后一个位置)
    • 思路分析:
    • [思路1:区间左右值二分查找 O(logN)](#思路1:区间左右值二分查找 O(logN))

专题三:二分查找模板:

:
1. 判断条件:while(......)left<=right 还是left<right。这是第一个容易死循环的点。

:
2. 求中点的方式:mid = left + (right-left)/2 还是 mid = left + (right-left+1)/2这个点很关键。如果和下面mid的迭代不相符,这便是第二个死循环的点。

:
3. left和right的迭代:是left = mid还是left = mid+1、是right = mid还是right = mid -1这都是需要清除的问题。

1. 朴素二分模板:

cpp 复制代码
while (left <= right)
{
	int mid = left + (right - left) / 2;
	if (......)
		right = mid - 1;
	else if (......)
		left = mid + 1;
	else
		return mid;
}

2. 区间左值模板:

特点: 左值:左动,下有+1上不加;

cpp 复制代码
while(left<right)
{
	int mid=left+(right-left)/2;
	if(...) left=mid+1;
	else right=mid;
}

3. 区间右值模板:

特点: 右值:右动,下有-1+1

cpp 复制代码
while(left<right)
{
	int mid=left+(right-left+1)/2;
	if(...) right=mid-1;
	else left=mid;
}

题目1:704. 二分查找

思路分析:

思路1:朴素二分查找O(logN)

代码实现:

cpp 复制代码
class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left = 0, right = nums.size() - 1;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] > target)
                right = mid - 1;
            else if (nums[mid] < target)
                left = mid + 1;
            else
                return mid;
        }
        return -1;
    }
};

LeetCode链接:704. 二分查找


题目2:34. 在排序数组中查找元素的第一个和最后一个位置

思路分析:

:
主要三个点:判断条件、mid取值、left和right迭代

思路1:区间左右值二分查找 O(logN)

代码实现

cpp 复制代码
class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        int left=0,right=nums.size()-1;
        int begin=-1,end=-1;    
        if(nums.empty()) return {-1,-1}; 
        //1.区间左端点查找: 二分区间:[小于目标值][大于等于目标值] left维护前者,right维护后置,目标值在right区间左端取到。
        while(left<right)		//判断:为什么不能等于,因为最终结果是left=right处取到,=就死循环
        {
            int mid=left+(right-left)/2;	//当还剩最后left和right相邻时,指向左端点,结合迭代,左端点可以跳出来,右端点不能。
            if(nums[mid]>=target) right=mid;	//right不跳出区间,因为可能目标值就是right处
            else left=mid+1;					//left需要移动,因为目标值一定不在它的区间
        }
        if(target==nums[left])  begin=left;
        //2.区间左端点查找:  
        right=nums.size()-1;	//注意更新left和right,优化:右端点一定在左端点后,所以left可以不更新,就处于左端点处
        while(left<right)
        {
            int mid=left+(right-left+1)/2;	
            if(nums[mid]>target) right=mid-1;
            else left=mid;
        }
        if(target==nums[left])    end=left;
        
        return {begin,end};
    }
};

LeetCode刷题:34.在排序数组中查找元素的第一个和最后一个位置


进入二分,我更强大!!! ~天天开心🎈

相关推荐
生物信息与育种16 分钟前
黄三文院士领衔植物星球计划(PLANeT)发表Cell
人工智能·深度学习·算法·面试·transformer
aini_lovee22 分钟前
WSN 四大经典无需测距定位算法
算法
人道领域22 分钟前
【LeetCode刷题日记】掌握二叉树遍历:栈实现的三种绝妙方法
算法·leetcode·职场和发展
北冥湖畔的燕雀23 分钟前
深入解析Linux信号处理机制
算法
阿Y加油吧31 分钟前
二刷 LeetCode:动态规划经典双题复盘
算法·leetcode·动态规划
上弦月-编程1 小时前
C语言指针超详细教程——从入门到精通(面向初学者)
java·数据结构·算法
莫等闲-1 小时前
代码随想录一刷记录Day44——leetcode1143.最长公共子序列 53. 最大子序和
数据结构·c++·算法·leetcode·动态规划
生成论实验室1 小时前
《事件关系阴阳博弈动力学:识势应势之道》第七篇:社会与情感关系——连接、表达与共鸣
人工智能·算法·架构·交互·创业创新
承渊政道1 小时前
【动态规划算法】(背包问题经典模型与解题套路)
数据结构·c++·学习·算法·leetcode·动态规划·哈希算法
yyy(十一月限定版)1 小时前
数电1对应latex代码
算法