二分查找!!!!

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

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

二分查找!!!!_第1张图片
左闭右闭:

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的左边那个数

你可能感兴趣的:(#,二分查找,算法,二分查找)