二分总结
- 二分插入, 返回有序数组二分插入的位置, 若存在则返回-1
int binaryInsert(vector<int>& nums, int val) {
// 这个可以不用加这个条件
if (nums.empty()) {
return 0;
}
int low = 0, high = nums.size() - 1;
while (low + 1 < high) {
int mid = low + (high - low) >> 1;
// 找最左区间往左边移动
if (nums[mid] >= val) {
high = mid;
} else if (nums[mid] < val) {
low = mid;
}
}
if (nums[low] == val || nums[high] == val) {
return -1;
}
if (nums[low] > val) {
return low;
}
return high;
}
- 二分查找最左大于等于
int binary_search_left(vector<int>& nums, int val) {
if (nums.empty()) {
return -1;
}
int low = 0, high = nums.size() - 1;
while (low + 1 < high) {
int mid = low + (high - low) >> 1;
// 尽量向左
if (nums[mid] >= val) {
high = mid;
} else {
low = mid;
}
}
if (nums[low] >= val) {
return low;
}
if (nums[high] >= val) {
return high;
}
return -1;
}
- 二分查找最右大于等于
int binary_search_right(vector<int>& nums, int val) {
if (nums.empty()) {
return -1;
}
int low = 0, high = nums.size() - 1;
while (low + 1 < high) {
int mid = low + (high - low) >> 1;
// 尽量向右
if (nums[mid] <= val) {
low = mid;
} else {
high = mid;
}
}
if (nums[high] >= val) {
return high;
}
if (nums[low] >= val) {
return low;
}
return -1;
}