当前位置:网站首页>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;
}
边栏推荐
- Force buckle, 752-open turntable lock
- 【ORB_SLAM2】void Frame::AssignFeaturesToGrid()
- 使用DBeaver进行mysql数据备份与恢复
- BioVendor Human Club Cellular Protein (CC16) Elisa Kit Research Fields
- NIO's Sword
- PHP uses PHPRedis and Predis
- 【Unity入门计划】2D Game Kit:初步了解2D游戏组成
- MySQL - CRUD operations
- Check if IP or port is blocked
- 2022-07-30 mysql8 executes slow SQL-Q17 analysis
猜你喜欢

Entry name 'org/apache/commons/codec/language/bm/gen_approx_greeklatin.txt' collided

Oracle19c安装图文教程

Nanoprobes免疫测定丨FluoroNanogold试剂免疫染色方案

Data transfer at the data link layer

【Unity入门计划】2D Game Kit:初步了解2D游戏组成

【LeetCode每日一题】——654.最大二叉树

LeetCode刷题日记:LCP 03.机器人大冒险

BioVendor人俱乐部细胞蛋白(CC16)Elisa试剂盒研究领域

"NetEase Internship" Weekly Diary (1)

LeetCode Brushing Diary: 74. Searching 2D Matrix
随机推荐
2022-08-01 安装mysql监控工具phhMyAdmin
oracle查询扫描全表和走索引
[LeetCode Daily Question] - 103. Zigzag Level Order Traversal of Binary Tree
字符串常用方法
用位运算为你的程序加速
PHP live source code to achieve simple barrage effect related code
Reflex WMS Intermediate Series 7: What should I do if I want to cancel the picking of an HD that has finished picking but has not yet been loaded?
bool框架::PosInGrid (const简历:关键点kp, int &posX, int诗句)
A good book for newcomers to the workplace
记一个gorm初始化的坑
Use baidu EasyDL implement factory workers smoking behavior recognition
永磁同步电机36问(三)——SVPWM代码实现
"NetEase Internship" Weekly Diary (2)
Golang分布式应用之Redis
【LeetCode Daily Question】——704. Binary Search
Garbage Collector CMS and G1
Handwritten Blog Platform ~ Day Two
[LeetCode Daily Question]——654. The largest binary tree
2022河南青训联赛第(三)场
Rasa 3.x 学习系列- Rasa - Issues 4873 dispatcher.utter_message 学习笔记