亂七八糟以爲有用的東西

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 () 就是c++友情提供的方便的大於函數,這樣就不用本身動手寫一個cmp函數了(其實就是懶)

它們的實現方式是二分查找 ,存在的意義就是讓咱們寫代碼更方便地偷懶(一行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;
a[p]即a[1]到a[n]中第一個小於等於x的數

(被遺忘的upper_bound表示不服)
2020.12.12 數組的讀入 : for(int i=1;i<=n;++i)scanf("%lld",sz+i);

相關文章
相關標籤/搜索