个人认为,这一题不会就是压根就没有明白二分查找,本人就是。。。。。
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int left = 0;
int right = nums.size();
int middle = 0;
while (left < right) {
middle = left + (right - left) / 2;
if (nums[middle] > target) {
right = middle;
if (left >= right) return middle;
} else if (nums[middle] < target) {
left = middle + 1;
if (left >= right) return middle + 1;
} else {
return middle;
}
}
return 0;
}
};
哈哈哈看着都想笑,虽然过了但是丑陋至极。其实还是没有搞清楚二分法的精髓。
我们在使用二分法的时候,如果你用的是左闭右开,也就是你一定会写这样一段代码:
right = middle;
也就是说,如果最终在数组中没找到 target 所处的位置的话,那么就应该使得 left 在不断得靠近 right ,最后也就是三位一体,也就是说至少可以保证, left 会最终指向应该插入 target 的位置。
为了更好地理解这种左闭右开的区间,记住这几点:
- 初始化时,left 指向数组的第一个元素,而 right 指向数组的长度(即 nums.size()),所以区间是 [left, right)。
- 在循环中,我们根据 nums[middle] 和 target 的比较结果来调整 left 和 right,使得区间逐渐缩小:
• 如果 nums[middle] < target,说明目标值在右半部分,于是我们让 left = middle + 1,排除掉 middle 这个位置。
• 否则,目标值在左半部分或等于 middle 这个位置,于是我们让 right = middle,保持区间左闭右开。- 最终,当 left 和 right 重合时,即 left == right,循环结束。此时,left 就是 target 应该插入的位置。