日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STL之lower_bound,upper_bound二分查找函数 结构体

發布時間:2023/12/14 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STL之lower_bound,upper_bound二分查找函数 结构体 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

codeforces上的代碼是開放的,常常就能看到本渣與大神們的差距

比如二分查找。。。

1.在數組中,找出第一個4所在位置

輸入:

14 4 1 2 2 3 4 4 4 4 5 6 7 9 9 10

這是本鶸代碼。。。。。。。

#include <stdio.h> int a[1010],n; int main(){int i,l,r,mid,b;scanf("%d%d",&n,&b);for(i=1;i<=n;i++)scanf("%d",&a[i]);l=0,r=n;while(l+1<r){mid=(l+r)/2;if(a[mid]<b)l=mid;else r=mid;//a[mid]>=b}if(a[r]==b)printf("%d\n",r);//找數字b出現在最左側else printf("NO\n");return 0; }

輸出:

然而大神是這樣寫的:

#include <cstdio> #include <algorithm> using namespace std; int a[1010],n; int main(){int i,b,pos;scanf("%d%d",&n,&b);for(i=1;i<=n;i++)scanf("%d",&a[i]);pos=lower_bound(a+1,a+1+n,b)-a;//找數字b出現在最左側if(pos==n+1||a[pos]!=b)printf("NO\n");else printf("%d\n",pos);//a[pos]==b;return 0; }

2.在數組中,找出最后一個4所在位置

輸入:

14 4 1 2 2 3 4 4 4 4 5 6 7 9 9 10

這是本鶸代碼。。。。。。。

#include <stdio.h> int a[1010],n; int main(){int i,l,r,mid,b;scanf("%d%d",&n,&b);for(i=1;i<=n;i++)scanf("%d",&a[i]);l=1,r=n+1;while(l+1<r){mid=(l+r)/2;if(a[mid]<=b)l=mid;else r=mid;}if(a[l]==b)printf("%d\n",l);//找數字b出現在最右側else printf("NO\n");return 0; }

然而大神是這樣寫的:

#include <cstdio> #include <algorithm> using namespace std; int a[1010],n; int main(){int i,b,pos;scanf("%d%d",&n,&b);for(i=1;i<=n;i++)scanf("%d",&a[i]);pos=upper_bound(a+1,a+1+n,b)-a;//找數字b出現在最右側if(pos==n+1||a[pos-1]!=b)printf("NO\n");else printf("%d\n",pos-1);//a[pos-1]==b;return 0; }

3.用法

頭文件:#include <algorithm>

時間復雜度:一次查詢O(log n),n為數組長度。

圖示:

lower_bound:

功能:查找非遞減序列[first,last) 內第一個大于或等于某個元素的位置。

返回值:如果找到,則返回找到元素的地址;否則返回last的地址。(這樣不注意的話會越界,小心)

用法:int t=lower_bound(a+l,a+r,key)-a;(a是數組)。

upper_bound:

功能:查找非遞減序列[first,last) 內第一個大于某個元素的位置。

返回值:如果找到,則返回找到元素的地址;否則返回last的地址。(同樣這樣不注意的話會越界,小心)

用法:int t=upper_bound(a+l,a+r,key)-a;(a是數組)。

摘自https://blog.csdn.net/lwgkzl/article/details/82851346

結構體中查找:

把我們需要查找的數封裝成一個結構體。然后才可以在結構體重進行查找。即使我們只需要針對某一維進行查找,也需要把整個結構體構造出來。

代碼如下:

struct MY{int a,b;MY(){}MY(int a,int b):a(a),b(b){}bool operator<(const MY m)const{ //定義比較方式,這一步很重要return a<m.a;} };int main(){MY m[10];for(int i=0;i<10;i++){m[i] = MY(i+1,2*i);cout<<m[i].a<<" "<<m[i].b<<endl;}cout<<"請輸入你需要查找的數字a:"<<endl;int num;cin>>num;sort(m,m+10);//進行二分之前需要排序int aa = lower_bound(m,m+10,MY(num,0)) - m; //需要把我們查找的數封裝成一個結構體才能進行查找。cout<<"查到位置為:"<<aa<<endl;return 0; }

這里我只需要查找第一維,并且我對第一維進行了排序,只有有序數列才可以進行二分,然后在查找的時候,把其他維置零即可。但是必須要封裝成一個結構體

vector中也是同理:

代碼:

struct MY{int a,b;MY(){}MY(int a,int b):a(a),b(b){}bool operator<(const MY m)const{ //定義比較方式,這一步很重要return a<m.a;} };int main(){vector<MY>ve;for(int i=0;i<10;i++){ve.push_back(MY(i+1,2*i));cout<<ve[i].a<<" "<<ve[i].b<<endl;}cout<<"請輸入你需要查找的數字a:"<<endl;int num;cin>>num;sort(ve.begin(),ve.end());//進行二分之前需要排序int aa = lower_bound(ve.begin(),ve.end(),MY(num,0)) - ve.begin(); //需要把我們查找的數封裝成一個結構體才能進行查找。cout<<"查到位置為:"<<aa<<endl;return 0; }

ve.begin()指向vector的開始,ve.end()指向vector的結尾。

結果如下:

?摘自https://blog.csdn.net/codehappy123/article/details/97814162

輸入N個字符串后,排個序,同時記錄他在未排序之前的編號。所以這需要結構體。然后就是對結構體排序。之后需要在最快時間內找到前綴為s的第一個字符串,需要使用二分中 的lower_bound() 所以我們需要運用重載運算符,重新定義查找規則。

值得注意的是lower_bound()中第三個參數也必須是一個結構體,所以你需要將前綴字符串s封裝成結構體才可以查詢。
?

#include <bits/stdc++.h> using namespace std; struct node {int i;string s;bool operator<(const node m)const{return s<m.s;} }hah[1000006]; char ch[1000006]; bool cmp(struct node x,struct node y) {return x.s<y.s; } int main() {int n,m;scanf("%d %d",&n,&m);for(int i=0;i<n;i++){scanf("%s",ch);hah[i].s=ch;hah[i].i=i;}sort(hah,hah+n,cmp);while(m--){string c;int k;struct node kk;scanf("%d %s",&k,ch);c=ch;kk.s=c;int tt=lower_bound(hah,hah+n,kk)-hah;if(hah[tt+k-1].s.find(c)!=0)printf("-1\n");else printf("%d\n",hah[tt+k-1].i+1);}return 0; }

?

總結

以上是生活随笔為你收集整理的STL之lower_bound,upper_bound二分查找函数 结构体的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 免费在线视频你懂的 | 丰满人妻熟妇乱偷人无码 | 国产一级二级三级在线观看 | 快色视频 | 伊人久久伊人 | 欧美日韩制服 | 婷婷的五月 | 日韩激情国产 | 色婷五月| 99视频免费观看 | 亚洲伊人久久综合 | 1515hh成人免费看 | 舒淇裸体午夜理伦 | www.亚洲色图.com | 好男人视频www | 国产白浆一区二区 | 精品福利一区 | 日日爱886 | 国产欧美在线看 | 看黄免费网站 | 深夜成人福利 | 免费在线看黄色 | 亚洲色图视频在线观看 | 日本69少妇 | 狠狠干狠狠操 | 初尝情欲h名器av | 免费毛片在线播放 | 99这里有精品视频 | 亚洲国产欧洲 | 欧美一级免费大片 | 在线观看的毛片 | www久久精品 | 成人做受黄大片 | www四虎影院 | 日韩精品久久久久久 | 日韩精品中文字幕在线观看 | 亚洲精品国产精品国自产在线 | 亚洲精品国产精品国 | 国产免费aa | 黄色网址大全免费 | 永久免费看片在线播放 | 女人18毛片水真多18精品 | 粉色视频免费 | 免费看女人裸体 | 久久爱影视i | 久久精品视频18 | 伊人www| 欧美精品999 | 亚洲综合一区二区 | 国产中文字幕久久 | 成年人av在线播放 | 亚洲成人网在线观看 | 欧美在线视频免费 | 一本久道视频一本久道 | 亚洲国产高清国产精品 | 亚洲男女一区二区三区 | 黄色一级影片 | 欧美人成在线视频 | 久久中文视频 | 日韩精品一级 | 91男女视频 | 亚洲男人天堂2017 | 亚洲好看站 | 国产成人精品视频在线 | 久久精品韩国 | www.香蕉视频 | 国产成人精品视频ⅴa片软件竹菊 | 欧洲自拍偷拍 | 91网站在线看 | 粉嫩av一区二区三区免费观看 | 欧美人体视频 | 日韩精品一区中文字幕 | 50一60岁老妇女毛片 | 上海毛片 | 国产欧美久久久久久 | 最新日韩av在线 | 国产黄色三级 | 无码国产69精品久久久久网站 | 日韩视频网址 | 欧美日韩一二三区 | 国产午夜毛片 | 美女二区 | 国产91久久精品一区二区 | www.四虎在线 | 中字幕一区二区三区乱码 | 亚洲最大的黄色网 | 国产精品伦一区 | 在线观看亚洲 | 黄色三级视频网站 | 亚洲乱码在线观看 | 成人区人妻精品一区二 | 久久性爱视频网站 | 久久久久99精品成人片毛片 | 视频一区二区三区在线观看 | 亚洲在线观看一区二区 | 日韩欧美激情视频 | 欧洲亚洲一区二区 | 青青在线精品 | 精品国产免费看 |