最近一直在學dp,但是感覺進度明顯慢了很多,希望自己可以加一把勁,不要總是拖延了...
在LIS的優化中我遇到了二分查找的問題,之前也知道lower_bound和upper_bound兩個函數,但是沒有做一個具體的總結,在下面我會總結這兩個函數的用法,也會給出這兩個函數的實現代碼,代碼是參考c ++ Reference 里面的...
lower_bound:
這個函數的頭文件為#include <algorithm>,函數的返回值為一個指向單調序列[first, last) 中第一個不小於val的元素的地址,如果不存在滿足條件的
元素則返回NULL。你可以用該函數得到的指針的值減去數組開頭元素的地址得到他在單調序列中的位置。
下面解釋一下該函數的幾個參數:lower_bound(first, last, val);
表示在有序序列[first, lase) 的所有值中,第一個不小於val的元素的地址。
下面給出我自己對於lower_bound優化后實現的代碼:有錯誤還請多多指出...
該代碼並沒有返回指針,而是直接返回了下標......
1 int lower_bound(vector<int> &a, int val) { 2 int first = 0, last = a.size() - 1, mid; 3 while(first <= last) { 4 mid = last - (last - first) / 2; 5 if(a[mid] >= val) last = mid - 1; 6 else first = mid + 1; 7 } 8 return first; 9 }
upper_bound
這個函數和上面的函數內容只有一點不同,他返回的是單調序列中第一個大於val的元素的地址,如果不存在滿足條件的元素則返回NULL,下面再給出我自己寫的版本......
1 int upper_bound(vector<int> &a, int val) { 2 int first = 0, last = a.size() - 1, mid; 3 while(first <= last) { 4 mid = last - (last - first) / 2; 5 if(a[mid] <= val) first = mid + 1; 6 else last = mid - 1; 7 } 8 return first; 9 }