AcWing 789. 数的范围 (整数二分)
AcWing 789. 数的范围
题意:
- 给定一个升序数组
- 输入一个数
- 输出这个数第一次出现的下标和最后一次出现的下标
- 如果这个数不存在则输出-1 -1
思路:
- 用两次二分
- 第一次用来找到key出现的第一个位置 (区间二段性的分界点:左边 < 分界点,右边 >= 分界点)
- 第二次用来找到key出现的最后一个位置 (区间二段性的分界点:左边 <= 分界点,右边 > 分界点)
public class Main {Scanner s = new Scanner(System.in);int n, q;int[] arr;int num;void run() {n = s.nextInt();q = s.nextInt();arr = new int[n];for (int i = 0; i < n; i++) {arr[i] = s.nextInt();}while (q-- > 0) {num = s.nextInt();range(arr, num);}}void range(int[] arr, int num) {// 先从数组找到第一个num的下标int l1 = 0, r1 = arr.length - 1;while (l1 < r1) {int mid = (l1 + r1) / 2;// arr[mid]符合左半段性质if (arr[mid] < num) {l1 = mid + 1;} else {r1 = mid;}}// 从数组中找到最后一个num的下标int l2 = 0, r2 = arr.length - 1;while (l2 < r2) {int mid = (l2 + r2) / 2 + 1;// arr[mid]符合右半段性质if (arr[mid] > num) {r2 = mid - 1;} else {l2 = mid;}}System.out.println(arr[l1] == num ? l1 + " " + l2 : "-1 -1");}public static void main(String[] args) {new Main().run();}
}
收获
避免二分法死循环的方式
// mid 向下取整时,l要相对mid移动,l == r时终止循环,此时l处即为key第一次出现的位置 int l = 0; int r = arr.length - 1; while (l < r) {int mid = l + (r - l) / 2;if (key > arr[mid]) {l = mid + 1;} else {r = mid;} }
// mid 向上取整时,r要相对mid移动,l == r时终止循环,此时r处即为key第一次出现的位置 int l = 0; int r = arr.length - 1; while (l < r) {// 向上取整int mid = l + (r - l) / 2 + 1;if (key < arr[mid]) {r = mid - 1;} else {l = mid;} }
AcWing 789. 数的范围 (整数二分)相关推荐
- AcWing 789. 数的范围
题目链接 https://www.acwing.com/problem/content/791/ 思路 写一个划分x为左边界和有边界的整数二分方法即可 #include<bits/stdc++. ...
- 模版 ----- 整数二分
整数二分思想 确定一个区间,使得目标值一定在这个区间内 从题目中找到一种性质: 该性质具有二段性,比如一个数组的前半段元素符合该性质,后半段元素就不符合该性质了 目标值一定为二段性的分界点处 即:目标 ...
- 二分算法详解:整数二分及浮点数二分算法(Binary Search)(含算法模板)
一.二分算法简介 当我们要从一个序列中查找一个元素的时候,最简单无脑的方法就是顺序查找法,但由于在大数据情况下爆炸的时间复杂度而舍弃. 最常见的方法是二分查找,也称折半查找(Binary Search ...
- (ACWing yxc讲解基础算法课程笔记)基础算法 整数二分
二分排序: 整数二分: 我们先来说一下单调性和二分的区别,有单调性一定能进行二分排序,但是能进行二分排序的不一定有单调性.所以说二分的本质并非是单调性. 我们假设有这样一个范围.我们能把它分成两个部分 ...
- 整数二分详解---yxc
//整数二分的模板 1.while(l<r) { int mid=l+r+1>>2; if(check(mid)) l=mid; else r=mid-1; } 2.while(l& ...
- 整数二分查找原理及代码模板
1.整数二分算法原理 ps:数组具有单调性,则一定可以使用整数二分算法:但是,能够使用整数二分算法的数组,数组未必具有单调性. 整数二分算法的本质:给定一个区间,在区间中定义了某种性质.该性质在区间的 ...
- leetcode 两数之和 整数反转 回文数 罗马数字转整数
1.两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个 ...
- 【AcWing 243. 一个简单的整数问题2】
例题:[AcWing 243. 一个简单的整数问题2] 线段树模板题,区间修改区间求和. 题解: 将序列分成N/B块,维护: id[i] = i/B,i所在块标号 res[id] = 第id块的sum ...
- 不大于数的2整数幂的数
获得不大于数的2整数幂的数.例如, 不大于6的2整数幂的数是4. 1 #include <bitset> 2 3 using namespace std; 4 5 /* 6 * 返回不大于 ...
最新文章
- 必须要懂得的密码技术
- 云视频会议的“多、快、好、省”(下)
- [Flex] 组件Tree系列 —— 阻止用户点击选中Tree中分支节点
- Windows 10 系统安装教程
- 深入理解最大池化为什么能够实现不变性?
- python templates_python templates在哪
- MySQL sql99语法—等值连接
- 基于Xml 的IOC 容器-载入<property>的子元素
- MCU,RTOS,物联网之间的关系。
- 视觉测试_视觉设计流行测验
- 数据挖掘——数据仓库
- eclipse中java.lang.OutOfMemoryError: Java heap space错误
- android textview密文,TextView 明密文处理
- 顺丰业绩突然爆雷:预计巨亏9-11亿!京东、美团等10家平台承诺不用大数据杀熟;苹果推迟MacBook和iPad生产|极客头条...
- mysql配置文件my.cnf的事例并附解释
- ubuntu mysql主从备份_Ubuntu 16 MySQL主从备份配置
- Qt总结之二十:加载字体库
- Linux Qt入门:工程构建笔记一
- Java如何提高poi的user模式解析excel大小上限
- 程序设计基本结构———顺序、选择与循环