二分法《找数》
2026-05-11 20:15:58
发布于:广东
32阅读
0回复
0点赞
难度超低,新手小白都能会的教程来了!!!
| 难度 | 复杂度 |
|---|---|
| 60/100 | 40/100 |
①首先☝️,先读题!
Ta说:
给一个长度为n的单调递增的正整数序列,即序列中每一个数都比前一个数大。找一个数k,问序列中最后一个小于等于k的数是什么?
②然后☝️,理思路!
题目让我们做的事:
①:缩小满足条件数的最终范围(二分)
注意:1、左右边界的值不能相等(l+1<r)
2、满足a[t]<=k,l=t+1;
3、否则r=t-1;
②:根据最终左右边界的结果做判断,输出
注意:1、判断a[r]<=k,满足则输出a[r]
2、否则判断a[l]<=k,满足则输出a[l]
3、没找到则输出-1
③最后☝️,我们来写代码!
#include<bits/stdc++.h>
#pragma GCC optimize(3)
using namespace std;
int a[200010]={};
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n,k,l=0,r=0,t=0;
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
}
l=1;
r=n;
while(l+1<r){
t=(l+r)/2;
if(a[t]<=k){
l=t+1;
}else {
r=t-1;
}
}
if(a[r]<=k){
cout<<a[r];
}else if(a[l]<=k){
cout<<a[l];
}else{
cout<<-1;
}
return 0;
}
//YC:ALPHA-1红右手特遣队
拜拜👋
这里空空如也







有帮助,赞一个