二分查找#
- 在有序数组中确定num的存在
二分查找的两种写法#
// 左闭右开
//更适合找边界、插入位置等复杂问题
int searchInsert(vector<int>& nums, int target) {
int left = 0;
int right = nums.size();// !!
while (left < right) {// !!
int mid = left + ((right - left) >> 1);// >>运算的优先级低于+
if (nums[mid] == target)
return mid;
else if (nums[mid] < target)
left = mid + 1;// !!
else
right = mid;// !!
}
return left;
}
// 闭区间
//更适合标准查找、简单理解
int searchInsert(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;// !!
while (left <= right) {// !!
int mid = left + ((right - left) >> 1);
if (nums[mid] == target)
return mid;
else if (nums[mid] < target)
left = mid + 1;// !!
else
right = mid - 1;// !!
}
return left;
}
- 在有序数组中找到>=num的最左位置
int findLeft(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;// !!
int ans = -1;
while (left <= right) {// !!
int mid = left + ((right - left) >> 1);
if (nums[mid] >= target)
ans = mid;
right = mid - 1;
else
left = mid + 1;// !!
}
return ans;
}
- 在有序数组中找到<=num的最右位置
int findRight(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;// !!
int ans = -1;
while (left <= right) {// !!
int mid = left + ((right - left) >> 1);
if (nums[mid] <= target)
ans = mid;
left = mid + 1;
else
right = mid - 1;// !!
}
return ans;
}