当前位置:网站首页>789. 数的范围
789. 数的范围
2022-08-02 02:20:00 【Hunter_Kevin】
题目
给定一个按照升序排列的长度为 n 的整数数组,以及 q 个查询。
对于每个查询,返回一个元素 k 的起始位置和终止位置(位置从 0 开始计数)。
如果数组中不存在该元素,则返回 -1 -1。
输入格式
第一行包含整数 n 和 q,表示数组长度和询问个数。
第二行包含 n 个整数(均在 1∼10000 范围内),表示完整数组。
接下来 q 行,每行包含一个整数 k,表示一个询问元素。
输出格式
共 q 行,每行包含两个整数,表示所求元素的起始位置和终止位置。
如果数组中不存在该元素,则返回 -1 -1。
数据范围
1≤n≤100000
1≤q≤10000
1≤k≤10000
输入样例:
6 3
1 2 2 3 3 4
3
4
5
输出样例:
3 4
5 5
-1 -1
思路
二分,用两种二分模板,从左往右查找左边界,从右往左查找右边界
如果是从左往右查找缩小范围得话,即l=mid+1
,则不需要注意死循环,在求mid时向下取整即可,即mid=l+(r-l>>1);
防止数据溢出并向下取整
如果是从右往左缩小范围的话,即r=mid-1
,则需要注意死循环,在求mid时,需要向上取整,即mid=l+(r-l+1>>1);
防止数据溢出并且向上取整
做题步骤
- 先找出查找的区间边界k左右两边的性质
if(num[mid]满足左边的性质)
,看看mid是否包含在[l,k]区间
内,如果边界答案k在mid的右半边,并且mid位置的元素不可能等于边界条件k,满足条件时更新查找的左边界为l=mid+1
,与之对应的不满足性质时则更新右边界为r=mid
,此时向下取整即可if(num[mid] 满足边界左边的性质)
,看看mid是否包含在[l,k]区间
内,如果边界答案k在mid的右半边,并且mid位置的元素有可能等于边界条件k,满足性质时则更新查找的左边界为l=mid
,与之对应的不满性质时则更新右边界为r=mid-1
,此时注意防止死循环需要向上取整(死循环:如果mid向下取整,mid=l+r>>1仍然等于l,当判断性质时更新的是左边界时执行l=mid,导致查找区间的左边界不会发生变化,没有更新右边界自然也不会右变化,陷入死循环
)
代码
#include <iostream>
using namespace std;
const int N = 100010;
int num[N];
int main()
{
int n, q;
cin >> n >> q;
for(int i = 0; i < n; i++)scanf("%d", &num[i]);
while(q--){
int k;
cin >> k;
int l = 0, r = n-1;
//左边界逐渐从左往右移动
//把区间分为[l,mid] [mid+1,r]
while(l < r){
int mid = l + (r-l>>1);//向下取整
if(num[mid] < k) l = mid+1;
else r = mid;
}
if(num[l] != k){
printf("-1 -1\n");
continue;
}
printf("%d ",l);
l = 0, r = n-1;
//右边界逐渐从右往左移动
//把区间分为[l, mid-1] [mid, r]
while(l < r){
int mid = l + (r-l+1 >> 1);//向上取整
if(num[mid] <= k) l = mid;
else r = mid-1;
}
printf("%d\n",l);
}
return 0;
}
边栏推荐
- LeetCode刷题日记:34、 在排序数组中查找元素的第一个和最后一个位置
- NIO‘s Sword(牛客多校赛)
- 【web】Understanding Cookie and Session Mechanism
- Handwriting a blogging platform ~ Day 3
- bool框架::PosInGrid (const简历:关键点kp, int &posX, int诗句)
- 十字光标太小怎么调节、CAD梦想画图算量技巧
- ALCCIKERS Shane 20191114
- 2022年NPDP考完多久出成绩?怎么查询?
- LeetCode Review Diary: 34. Find the first and last position of an element in a sorted array
- CodeTon Round 2 D. Magical Array 规律
猜你喜欢
LeetCode刷题日记:LCP 03.机器人大冒险
Install mysql using docker
Analysis of volatile principle
AI目标分割能力,无需绿幕即可实现快速视频抠图
Ringtone 1161. Maximum In-Layer Elements and
"NetEase Internship" Weekly Diary (1)
Redis 底层的数据结构
【web】理解 Cookie 和 Session 机制
[ORB_SLAM2] void Frame::ComputeImageBounds(const cv::Mat & imLeft)
Electronic Manufacturing Warehouse Barcode Management System Solution
随机推荐
FOFAHUB usage test
软件测试 接口自动化测试 pytest框架封装 requests库 封装统一请求和多个基础路径处理 接口关联封装 测试用例写在yaml文件中 数据热加载(动态参数) 断言
Chengdu openGauss user group recruit!
Redis Subscription and Redis Stream
How to adjust the cross cursor too small, CAD dream drawing calculation skills
Project Background Technology Express
nacos startup error, the database has been configured, stand-alone startup
2022-08-01 Install mysql monitoring tool phhMyAdmin
The failure to create a role in Dahua Westward Journey has been solved
2022 NPDP take an examination of how the results?How to query?
LeetCode Brushing Diary: 74. Searching 2D Matrix
swift项目,sqlcipher3 -&gt; 4,无法打开旧版数据库有办法解决吗
LeetCode brush diary: LCP 03. Machine's adventure
Entry name 'org/apache/commons/codec/language/bm/gen_approx_greeklatin.txt' collided
2022-08-01 反思
to-be-read list
BioVendor Human Club Cellular Protein (CC16) Elisa Kit Research Fields
Nanoprobes免疫测定丨FluoroNanogold试剂免疫染色方案
Remember a pit for gorm initialization
Constructor instance method inheritance of typescript37-class (extends)