二分通用模板+例题java

news2024/9/21 0:46:43

🧡🧡二分大前提🧡🧡

有序数列!!

🧡🧡模板🧡🧡

查找具体某个元素

while(left<=right) :三个分支,在循环里直接返回答案

//二分查找具体元素
public int search(int[] nums,int target) {
	int left=0;
	int right=nums.length-1;
	while(left<=right) {
		int mid=(left+right)>>>1; 
		if(nums[mid]==target) {
			return mid;
		}else if(nums[mid]>target) {
			right=mid-1;
		}else {
			left=mid+1;
		}
	}
	return -1;
}

查找满足条件的最小/最大元素

while(left<right) :两个分支,答案需要退出循环再做进一步处理

如下图,绿色为符合条件的区间,我们需要找到满足“最小性”的ans。画了两条绿线代表mid与ans位置相对大小的两种情况。
在这里插入图片描述

//找到第一个大于等于target的位置
//即找到00000111111中第一个1的位置
public int func(int[] nums, int target) {	  
	int left=0;
	int right=nums.length-1;
	  
	while(left<right) {
		int mid=(left+right)>>>1;
		if(nums[mid]>=target) right=mid;
		else left=mid+1;
	}
	  
	//循环退出,left==right
	return left;
}

同理,如下图,绿色为符合条件的区间,我们需要找到满足“最大性”的ans
在这里插入图片描述

//找到第一个小于等于target的位置
//即找到11111100000中最后一个1的位置
public int func(int[] nums, int target) {	  
	int left=0;
	int right=nums.length-1;
	  
	while(left<right) {
		int mid=(left+right+1)>>>1; //注意+1
		if(nums[mid]<=target) left=mid;
		else right=mid-1;
	}
	
	//循环退出,left==right
	return left;
}

注意点

  1. 以上代码中,(left+right)>>>1 等价于 (left+right)/2,其原理是进无符号右移,例如1100>>>1 变为 0110。有些情况下,为避免left+right爆范围(如果left和right都是int型,那么它们相加超过65535就会爆范围,产生小错误),可以采用变式:left + (right-left)>>>1, 这样爆范围的风险就小了。
  2. 如何确保if else中的条件顺序不乱,笔者是这样记忆的:先写if的条件,找“最小性”,则需要mid >= xxx (>=就有“最小”的意思咯);找“最大性”,则需要 mid <= xxx ( <=就有“最大”的意思咯 )。然后接着写else即可。
    在这里插入图片描述在这里插入图片描述
  3. 对于(left+right)>>>1 和 (left+right+1)>>>1 的区别为“是否+1”,为避免混淆两种最大最小性的二分查找代码,笔者是这样记忆的:若二分代码中有mid-1,则对left+right进行填补+1; 若二分代码中有mid+1,则不进行填补+1。(有负则补

🧡🧡例题🧡🧡

力扣704-二分查找
在这里插入图片描述

public class Solution {
    public int search(int[] nums, int target) {
        int left=0;
        int right=nums.length-1;
        while(left<=right) {   
            int mid=(right-left)/>>>1+left; //为什么不是直接(right+left)/2呢?
            if(nums[mid]==target) {
                return mid;
            }else if(nums[mid]>target) {
                right=mid-1;
            }else {
                left=mid+1;
            }
        }
        return -1;
    }
}

acwing-789数的范围
在这里插入图片描述

import java.util.Scanner;

public class Main{
	public static int n, q;
	public static int[] arr;

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
		q = sc.nextInt();
		sc.nextLine(); // 消耗掉输入中的换行符

		arr = new int[n + 1];

		// input arr
		String inputString = sc.nextLine();
		String[] inputCharArr = inputString.split(" ");

		for (int i = 0; i < n; i++) {
			arr[i] = Integer.parseInt(inputCharArr[i]);
		}
//		System.out.println(Arrays.toString(arr));

		while (q-- > 0) {
			int x = sc.nextInt();
			int left = 0, right = n - 1;
			while (left < right) {
				int mid = (left + right) >>> 1; // 除2,向下取整
				if (arr[mid] >= x)
					right = mid;
				else
					left = mid + 1;
			}
			if (arr[left] == x) {
				System.out.print(left + " ");

				right = n - 1;
				while (left < right) {
					int mid = (left + right + 1) >>> 1; // 除2,向上取整
					if (arr[mid] <= x)
						left = mid;
					else
						right = mid - 1;
				}
				System.out.println(right);
			} else {
				System.out.println("-1 -1");
			}
		}
	}
}

力扣611-有效三角形的个数
在这里插入图片描述
思路:

  1. 三层for循环暴力枚举三条边,统计个数, O ( N 3 ) O(N^3) ON3
  2. 二层for循环枚举前两条边,再套一个二分找出能最大满足的边的下标,即可求出个数 O ( N 2 l o g N ) O(N^2logN) ON2logN
//排序+二分
public int triangleNumber(int[] nums) {
	int len=nums.length;
	//排序
	Arrays.sort(nums);
	if(len<3) return 0;
	int ans=0;
	for(int a=0;a<len-2;a++) {
		for(int b=a+1;b<len-1;b++) {
			if(nums[a]+nums[b]<=nums[b+1]) continue; 
			int left=b+1,right=len-1;
			//模板:找满足条件的最后一个(最大性)
			while(left<right) {
				int mid=(left+right+1)>>>1;
				if(nums[mid]>=nums[a]+nums[b]) {
					right=mid-1;
				}else {
					left=mid;
				}
			}
			ans+=left-b;
		}
	}
	return ans;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1480468.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JSON 文件里的 “$schema” 是干什么用的?

最近我在做一些前端项目&#xff0c;我发现有的配置文件&#xff0c;比如 .prettierrc.json 或者 tsconfig.json 里面都会看到一个 $schema 字段&#xff0c;有点好奇&#xff0c;就查了一下。 什么是 JSON Schema JSON Schema是一种基于JSON (JavaScript Object Notation) 的…

电梯物联网之梯控相机方案-防止电瓶车进电梯

梯控现状 随着电梯产品在智能化建筑的日益普及,对于电梯的智能化管理 安全性需求 的要求越来越迫切。尤其今年来随着电瓶车的大量普及&#xff0c;发起多起楼道、轿厢电瓶车着火恶性事件&#xff0c; 造成了极大的社会 负面影响。控制电瓶车进入单元门&#xff0c;楼道以及电梯…

浅析智能照明控制系统在图书馆照明节能中的应用

彭姝麟 Acrelpsl 0 引 言 照明耗电在各国总发电量中都占有很大比例&#xff0c;根据2004年国家住房和城乡建设部的统计&#xff0c; 我国照明耗电约占全国发电总量的10&#xff05;一12&#xff05;。 对一些照明时间较长、照明场所较多的机构&#xff0c;如高等学校&#xf…

百度新版VMP

百度搞事情哇最近&#xff0c;新上验证类型&#xff0c;曲线匹配&#xff01;&#xff01;&#xff01; 这年头儿&#xff0c;连百度都还是上vmp了兄弟们&#xff0c;越来越难咯。 个人感觉 想学好vm的话&#xff0c;首先得找个好位置插装&#xff0c;然后慢慢分析。 轨迹信息…

Spring注解之json 数据处理

目录 1. 过滤 json 数据 2. 格式化 json 数据 3. 扁平化对象 1. 过滤 json 数据 JsonIgnoreProperties 作用在类上用于过滤掉特定字段不返回或者不解析。 //生成json时将userRoles属性过滤 JsonIgnoreProperties({"userRoles"}) public class User { ​private S…

C++的继承和多态

继承和多态 继承继承的权限继承的子父类访问派生类的默认成员函数菱形继承&#xff08;C独有&#xff09;【了解】虚拟继承什么是菱形继承&#xff1f;菱形继承的问题是什么&#xff1f;什么是菱形虚拟继承&#xff1f;如何解决数据冗余和二义性的继承和组合的区别&#xff1f;…

Redis冲冲冲——事务支持,AOF和RDB持久化

目录 引出Redis事务支持&#xff0c;AOF和RDB持久化1、Redis的事务支持2、Redis的持久化 Redis冲冲冲——缓存三兄弟&#xff1a;缓存击穿、穿透、雪崩缓存击穿缓存穿透缓存雪崩 总结 引出 Redis冲冲冲——事务支持&#xff0c;AOF和RDB持久化 Redis事务支持&#xff0c;AOF和…

Windows系统x86机器安装龙芯(loongarch64)3A5000虚拟机系统详细教程

本次介绍在window系统x86机器上安装loongarch64系统的详细教程。 1.安装环境准备。 首先&#xff0c;你得有台电脑。 配置别太差&#xff0c;至少4核8G内存&#xff0c;安装window10或者11都行&#xff08;为啥不能是Window7&#xff0c;你要用也不是不行&#xff0c;你先解决…

模拟算法题练习(二)(DNA序列修正、无尽的石头)

&#xff08;一、DNA序列修正&#xff09; 问题描述 在生物学中&#xff0c;DNA序列的相似性常被用来研究物种间的亲缘关系。现在我们有两条 DNA序列&#xff0c;每条序列由 A、C、G、T 四种字符组成&#xff0c;长度相同。但是现在我们记录的 DNA序列存在错误&#xff0c;为了…

解析电源模块测试条件与测试步骤 快速完成测试

高温高湿储存测试是电源模块环境适应性测试内容之一&#xff0c;在实际使用过程中由于应用场景不同电源所处的环境也是多样的&#xff0c;因此需要测试电源对各种环境的适应能力&#xff0c;提高电源的性能和可靠性。 电源高温高湿存储测试的目的是为了测量环境对电源结构、元件…

Spring - InitializingBean、@PostConstruct、@Bean(initMethod = “init“)和构造方法执行优先级比较

执行顺序优先级 构造方法 > postConstruct > afterPropertiesSet > init方法 代码案例 Component public class InitializingBeanTest implements InitializingBean {public InitializingBeanTest(){System.out.println("构造方法");}Overridepublic void…

现代企业架构框架——技术架构

现代企业架构框架——技术架构。 技术架构是对某一技术问题(需求)解决方案的结构化描述,由构成解决方案的组件结构及之间的交互关系构成。广义上的技术架构是一系列涵盖多类技术问题设计方案的统称,例如部署方案、存储方案、缓存方案、日志方案等等。 现代企业架构框架(M…

直观理解卷积

卷积直观理解 原文来自最容易理解的对卷积(convolution)的解释 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;计算机杂记 &#x1f380;CSDN主页 发狂的小花 &#x1f304;人生秘诀&#xff1a;学习的本质就是极致…

linux操作docker

docker地址 官方地址 centos7安装docker 卸载旧版本docker sudo //在前面表示以管理员权限操作yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine安装docker //安装所需资…

Perforce Helix Core:摄像机内视觉特效(ICVFX)行业首选的版本控制工具

在当今数字娱乐时代&#xff0c;摄像机内视觉特效&#xff08;ICVFX&#xff09;和LED墙虚拟制片方法&#xff08;有时也称为现场虚拟制片&#xff09;&#xff0c;正在被用于创造一些最前沿的媒体作品。然而&#xff0c;实现令人惊叹的虚拟画面不仅需要先进的技术&#xff0c;…

QT TCP传输文件+ui

TCPFile tcp协议传输文件 TCPFile.pro QT core gui networkclientwidget.h #include <QWidget> #include <QTcpSocket> // 通信套接字 #include <QFile>private slots:void on_pushButton_clicked();private:QTcpSocket *tcpSocket;QFile file; /…

九州金榜|导致孩子厌学因素有哪些?家庭教育中要怎样解决?

现在如今孩子出现厌学的情况越来越严重&#xff0c;这也难坏了很多家长&#xff0c;众所周知&#xff0c;当下社会竞争越来越激烈&#xff0c;孩子的压力也越来越大&#xff0c;这也是导致孩子厌学的主要因素。其实家庭因素也是引起孩子厌学情绪产生的重要原因&#xff0c;在家…

通过一篇文章让你了解数据结构和算法的重要性

通过一篇文章让你了解数据结构和算法的重要性 前言一、 什么是数据结构&#xff1f;二、什么是算法&#xff1f;三、数据结构和算法的重要性在校园招聘的笔试中&#xff1a;在校园招聘的面试中&#xff1a;在未来的工作中&#xff1a; 四、如何学好数据结构和算法4.1 死磕代码&…

pom文件写入依赖爆红

pom.xml文件中每次写入依赖后都会爆红&#xff0c;因为单纯引入依赖并没有真正下载依赖包到本地仓库 重载maven项目&#xff0c;检测到没有的依赖后会自动下载依赖包&#xff0c;这时候等待右下角的下载进度条下载完毕即可

swift 长按桌面图标弹出快捷选项

文章目录 一、3D Touch二、主屏交互1. 静态添加2. 动态添加三、监听主屏交互按钮的点击事件四、预览和跳转1. 注册3D touch2. 实现协议3. 在目标控制器复写previewActionItems4. 使用UIContextMenuConfiguration一、3D Touch 3D Touch通过屏幕下方的压力感应器来感知不同的压力…