主页 > 开源代码  > 

二分查找!!!!

二分查找!!!!

比如有个从小到大排列的数组:[5, 7, 7, 8, 8, 10]

找到第一个≥8的数的位置

左闭右闭:

vector<int> nums{5, 7, 7, 8, 8, 10}; int target = 8; int lower_bound1() { int l = 0, r = nums.size() - 1; while(l <= r) { // [l, r] int m = l + (r - l) / 2; if(nums[m] < target) { // [m + 1, r] l = m + 1; }else { // [l, m - 1] r = m - 1; } } return l; // r + 1 }

左闭右开:

int lower_bound2() { int l = 0, r = nums.size(); while(l < r) { // [l, r) int m = l + (r - l) / 2; if(nums[m] < target) { // [m + 1, r) l = m + 1; }else { // [l, m) r = m; } } return l; // r }

左开右开:

int lower_bound() { int l = -1, r = nums.size(); while(l + 1 < r) { // (l, r) int m = l + (r - l) / 2; if(nums[m] < target) { // (m, r) l = m; }else { // (l, m) r = m; } } return r; // l + 1 } 找到第一个>8的数的位置

转化成:找到第一个 ≥ x + 1的数

找到第一个<8的数的位置

转化成:找到第一个 ≥ x 的左边那个数

找到第一个 ≤ 8的数的位置

转化成:找到第一个>x的左边那个数

标签:

二分查找!!!!由讯客互联开源代码栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“二分查找!!!!