lower_bound會找出序列中第一個大於等於x的數
upper_bound會找出序列中第一個大於x的數
這兩個是STL中的函數,做用很類似:c++
假設咱們查找x,那麼:數組
lower_bound會找出序列中第一個大於等於x的數函數
upper_bound會找出序列中第一個大於x的數.net
沒錯這倆就差個等於號╮(╯▽╰)╭指針
2.用法
如下都以lower_bound作栗子 (由於upper_bound作出的栗子很差吃)blog
(其實就是我懶得打兩遍)get
它們倆使用的前提是同樣的:序列是有序的qq
對於一個數組a,在[1,n]的區間內查找大於等於x的數(假設那個數是y),函數就寫成:總結
lower_bound(a + 1, a + 1 + n, x);sort
函數返回一個指向y的指針
看着是否是很熟悉?回想sort使用的時候:
sort(a, a + 1 + n, cmp);
這裏a+1,a+1+n的寫法是否是很像?
STL裏面的函數寫區間通常都這個尿性
一樣的,lower_bound和upper_bound也是能夠加比較函數cmp的:
lower_bound(a + 1, a + 1 + n, x, cmp);
到這裏不得不說說前面的"有序序列",這裏的"有序"是對什麼有序?
你可能已經猜到了,它是對於比較器有序,而且必須是升序!
(爲何不是降序?這個你可能要去問問寫STL的人)
一旦對降序序列使用lower_bound,就會出現神奇的錯誤,具體緣由能夠看這篇:
https://blog.csdn.net/qq1337715208/article/details/81072709
固然比較器默認也是"<"
若是要在一個降低序列裏尋找一個小於x的數呢?
根據咱們以前說的,lower_bound只能對上升序列使用,那我僞裝降低序列是個上升序列就好了嘛~
(lower_bound:你當我傻嗎)(w1049:沒錯我就當你傻)
只須要把比較器改爲">":
lower_bound(a + 1, a + 1 + n, x, cmp);
同時須要寫一個函數cmp:
bool cmp(const int& a,const int& b){return a > b;}
固然,你也能夠這樣:
lower_bound(a + 1, a + 1 + n, x, greater
這裏的
greater
它們的實現方式是二分查找 ,存在的意義就是讓咱們寫代碼更方便地偷懶(一行lower_bound比寫二分查找方便多了)
3.返回值
衆所周知,小蔥很是擅長計算組合數返回的是個指針
對於返回值咱們有兩種處理方式:
第一種:
許多人討厭指針,那麼咱們用這個指針減去數組開頭的指針(即數組名),獲得兩個指針的差,就是數組下標,即:
int p = lower_bound(懶得寫) - a;
那麼a[p]就是要找的y
(若是不知道爲何就記着好了)
第二種:
指針好!指針秒!
改革春風吹滿地,用指針的oier真爭氣!
(以上兩行你能夠當作什麼都沒看見)
int p = lower_bound(仍是懶得寫);
那麼p就是要找的y
能夠看出指針多麼直接,不像數組下標還要倒騰一遍
總結一下:####
好像沒什麼可總結的QwQ
對一個降低序列a
int p = lower_bound(a + 1, a + 1 + n, x, greater
a[p]即a[1]到a[n]中第一個小於等於x的數
(被遺忘的upper_bound表示不服)
2020.12.12 數組的讀入 : for(int i=1;i<=n;++i)scanf("%lld",sz+i);