二分查找
常规的二分搜索
1 while (l <= r) { 2 int mid = (l + r) / 2; 3 if (f[mid] == x)return mid; 4 if (f[mid] > x) l = mid + 1; 5 else r = mid - 1; 6 }
查找小于等于x的第一个数
int GetLastValueLessThan(int v, vector<int>& svec) { int low = 0, high = svec.size() - 1; while( low <= high ) { int mid = (low + high) >> 1; /* 如果要求查找严格小于x的第一个数,将改为svec[mid] >= v*/ if( svec[mid] > v ) high = mid - 1; else low = mid + 1; } return svec[high]; }
查找大于等于x的第一个数
int GetFirstValueGreaterThan(int v, vector<int>& svec) { int low = 0, high = svec.size() - 1; while( low <= high ) { int mid = (low + high) >> 1; /* 如果要求查找严格大于x的最后一个数,将改为svec[mid] > v*/ if( svec[mid] >= v ) high = mid - 1; else low = mid + 1; } return svec[low]; }

浙公网安备 33010602011771号