789. 数的范围

news/2024/7/24 7:10:04 标签: 算法

题目链接

思路

数据较大,且找左右端点,利用二分
此题考察二分写法
具体详见代码注释
我觉得二分的整体思路是很好理解的,难的地方就在于写法上的细节,比如要不要+1,要不要等于
总结小规律:
找哪边,哪边就+1,另一边就=

代码


#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 3;
int a[N];
int n;
int main()
{
	int q;
	cin >> n >> q;
	for (int i = 1; i <= n; i ++ )
	{
		cin >> a[i];
	}
	while (q -- )
	{
		int ll, rr;
		int l = 1, r = n;
		int x;
		cin >> x;
		while (l < r) //标准模板 
		{
			int mid = (l + r) / 2; //中间值 
			if (a[mid] < x) //因为要找左端点,所以左端点等于时就不能动了,所以只能写小于 
			{
				l = mid + 1; //小于的话,+1后就有可能等于,以后就不动了 
			}
			else if (a[mid] >= x) //让左端点不动,让右端点往左边靠,在左右范围里都,数都相等的情况下,比如l = 2, r = 3. a[l] = 2 , a[r] = 3, 要找左端点,(2 + 3) / 2,得到2=x,r就与l相等了 
			{
				r = mid;
			}
		}
		//如果找到了数,就记录答案 
		if (a[l] == x) 
		{
			ll = l;
		}
		else //没找到数就输出-1 
		{
			cout << "-1 -1" << endl;
			continue;
		}
		
		//找右端点 
		l = 1, r = n;
		while (l < r)
		{
			//因为(2 + 3) / 2 = 2,如果要找3,就永远找不到,就+1,让它往右边取 
			int mid = (l + r + 1) / 2;
			
			//与上面相反,这里是左边往右边靠,右边确定后不动,左边一步步靠近 
			if (a[mid] <= x)
			{
				l = mid;
			} //-1后很有可能正好是x,那么就不动了,如果不是,缩小点范围也没有影响 
			else if (a[mid] > x)
			{
				r = mid - 1;
			}
		}
//		//上面已经判过,如果有解,那么此处也一定有解 
		cout << ll - 1 << " " << l - 1 << endl;
	}
	return 0;
 } 

小扩展

>>1 右移一位相当于除以二


http://www.niftyadmin.cn/n/5187450.html

相关文章

MFC保存窗口客户区为图片

首先的窗口输出一些内容&#xff1b; 菜单单击函数代码&#xff1b; void CgetmypicView::OnTestGetmypic() {// TODO: 在此添加命令处理程序代码HWND hwnd this->GetSafeHwnd();HDC hDC ::GetWindowDC(hwnd);//获取DC RECT rect;::GetClientRect(hwnd, &rect)…

golang学习笔记——查找质数

查找质数 编写一个程序来查找小于 20 的所有质数。 质数是大于 1 的任意数字&#xff0c;只能被它自己和 1 整除。 “整除”表示经过除法运算后没有余数。 与大多数编程语言一样&#xff0c;Go 还提供了一种方法来检查除法运算是否产生余数。 我们可以使用模数 %&#xff08;百…

行内样式、内部样式、外部样式

行内样式&#xff1a; 该元素的所在本行中使用style标记来写样式 内部样式&#xff1a; 在head标签中使用style标记来写样式 外部样式&#xff1a; 在head标签中使用link标记引用外部样式 注意优先级&#xff1a; 行内样式&#xff1e;内部样式&#xff1e;外部样式 代码…

【Linux网络】工作环境救急——关于yum安装的5个花式操作

目录 1、只下载不安装&#xff0c;离线安装软件 2、自行打包创建元数据 第一步&#xff1a;先准备好nginx的软件包&#xff0c;放在一个文件夹下 第二步&#xff1a;在本地下载createrepo命令软件&#xff0c;用于创建元信息&#xff0c;这个一定是对包的上一级目录使用命令…

【整顿C盘】pycharm、chrome等软件,缓存移动

C盘爆了&#xff0c;特来找一下巨大的软件缓存&#xff0c;特此记录&#xff0c;跟随的各大教程&#xff0c;和自己的体会 一、爆炸家族JetBrains 这个适用于pycharm、idea、webstorm等等&#xff0c;只要是JetBrains家的&#xff0c;2020版本以上&#xff0c;都是一样的方法 p…

Android——模块级build.gradle配置——applicationId和namespace

官方地址&#xff1a; 配置应用模块-applicationId和namespace了解 build.gradle 中的实用设置。https://developer.android.google.cn/studio/build/configure-app-module?hlzh-cn 产生那些异常场景&#xff1a; Android&#xff1a;Namespace not specified. Please spec…

LeetCode - #89 格雷编码

文章目录 前言1. 描述2. 示例3. 答案关于我们 前言 我们社区陆续会将顾毅&#xff08;Netflix 增长黑客&#xff0c;《iOS 面试之道》作者&#xff0c;ACE 职业健身教练。&#xff09;的 Swift 算法题题解整理为文字版以方便大家学习与阅读。 LeetCode 算法到目前我们已经更新…

【Kingbase FlySync】命令行:同步软件安装部署,并实现KES到KES实现同步迁移

概述 Kingbase FlySync是面向同城/异地灾备、数据库平滑升级替换、数据集中共享与分发、应用上云迁移、数据库负载均衡等场景的数据同步产品。该产品基于增量日志解析技术&#xff0c;性能高、时延低、资源占用极少&#xff0c;能够实现异构数据源之间大规模增量数据的任意方向…