IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 二分法题解合集以及模板【持续更新】 -> 正文阅读

[数据结构与算法]二分法题解合集以及模板【持续更新】

自己平时写二分全靠运气,运气好的时候就能水过二分,究其原因还是自己对二分的过程不了解清楚,因此专门写一个BLOG来记录刷爆二分的过程。
首先贴一个究极好用模板:https://www.pianshen.com/article/90471307044/
二分法求解寻找有序序列中“第一个”满足某条件的元素的位置的模板:

//二分区间为左闭右闭的[left,right]
//解决“寻找有序序列第一个满足某条件A的元素的位置”
int solve(int left,int right){
	int mid;
	while(left<right){
		mid=(left+right)>>1;
		if(条件A成立){
			right=mid;
		}
		else left=right+1;
	}
	return left;
}

T1
P704二分查找
在这里插入图片描述
我们考虑条件A是什么,题目要找到等于target的目标位置,因此我们查找的条件为:有序序列中第一个大于等于target的位置,如果这个位置对应的数是target,就说明找到了,如果不是,则不存在这个数,返回-1。代码如下:

int search(vector<int>& nums, int target) {
    int n=nums.size();
    int left=0,right=n-1;
    int mid;
    while(left<right){
        mid=(left+right)>>1;
        if(nums[mid]>=target) right=mid;
        else left=mid+1;
    }
    if(nums[left]==target) return left;
    else return -1;
}

T2
P34在排序数组中查找元素的第一个和最后一个位置
在这里插入图片描述

本题可以分成两个二分来实现,第一个二分条件A为:寻找有序序列中第一个大于等于target的数的位置,查找到的第一个数如果不等于target,就说明数组中不存在target这个数,直接返回[-1,-1],如果等于target的话,起始位置就是查找到的这个位置,再进行第二次二分查找,条件A未寻找有序数列中第一个大于target的位置,注意,如果不存在大于target的数,即target是最大的数,那么返回的值left是会停在n-1的位置的,因此特判以下即可,代码如下:

vector<int> searchRange(vector<int>& nums, int target) {
    int n=nums.size();
    vector<int>ans(2,-1);
    if(n==0) return ans;
    int left=0,right=n-1;
    int mid;
    while(left<right){
        mid=(left+right)>>1;
        if(nums[mid]>=target) right=mid;
        else left=mid+1;
    }
    if(nums[left]==target) ans[0]=left;
    else return ans;
    left=0,right=n-1;
    while(left<right){
        mid=(left+right)>>1;
        if(nums[mid]>target) right=mid;
        else left=mid+1;
    }
    if(nums[left]==target) ans[1]=left; //特判一下target是否是最大的数
    else  ans[1]=left-1;
    return ans;
}

T3
P33搜索旋转排序数组
在这里插入图片描述
本题要求即几乎有序的数组,查找某个元素是否存在问题,因此我们可以把数组一分为二,则一定有一段是完全有序,而另一段是基本有序,我们在完全有序的数组中二分查找,没找到就继续分基本有序的数组,直到left=right为止。代码如下:

int search(vector<int>& nums, int target) {
    int n=nums.size();
    int left=0,right=n-1;
    int mid;
    while(left<right){
        mid=(left+right)>>1;
        if(nums[mid]==target) return mid;
        else if(nums[mid]<nums[right]){ //说明有序数组是[mid,right],进行二分查找
            if(nums[mid]>=target||nums[right]<target) right=mid; //注意条件
            else left=mid+1;
        }
        else{ //有序数组是[left,mid]
            if(nums[mid]>=target&&nums[left]<=target) right=mid;
            else left=mid+1;
        }
    }
    return nums[left]==target? left:-1;
}

写二分不能全靠模板,还是要真正自己理解


  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-12-04 13:41:41  更:2021-12-04 13:43:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 14:46:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码