
第一题:35. 搜索插入位置
题目链接:35. 搜索插入位置 - 力扣(LeetCode)
题目分析
题目:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。数组无重复元素。 核心:有序数组,找第一个 >= target 的位置,属于二分查找左边界模型。 边界注意:target 比所有数大,返回数组长度;比所有数小,返回 0。
算法原理
左边界二分模板:区间 [0, nums.size()),left < right。
- 若
nums[mid] >= target:答案在 mid 或者 mid 左边,收缩右边界right = mid - 若
nums[mid] < target:答案在 mid 右边,收缩左边界left = mid + 1循环结束,left == right,即为第一个 >= target 的下标。
代码编写
cpp
int searchInsert(vector<int>& nums, int target) {
int left = 0, right = nums.size();
while(left < right) {
int mid = left + (right - left) / 2;
if(nums[mid] >= target) {
right = mid;
} else {
left = mid + 1;
}
}
return left;
}
总结
本题是二分左边界基础模板,适合 "找第一个满足条件的位置",区间为左闭右开,循环条件固定 left < right。
第二题:69.x 的平方根
题目链接:69. x 的平方根 - 力扣(LeetCode)
题目分析
题目:给你一个非负整数 x ,计算并返回 x 的算术平方根。由于返回类型是整数,结果只保留整数部分,小数部分被舍去。 核心:在 0, x 区间二分,找最大的 mid 满足 mid * mid <= x。 边界注意:防止 mid*mid 溢出,改用 mid <= x/mid 判断。
算法原理
找满足条件的最大值二分,区间 [0, x],left <= right:
- 满足
mid <= x / mid:mid 是一个合法答案,记录 ans,继续向右尝试更大的值left = mid + 1 - 不满足:mid 太大,向左收缩
right = mid - 1循环结束,ans 保存最大合法值。
代码编写
cpp
int mySqrt(int x) {
int left = 0, right = x, ans = 0;
while(left <= right) {
int mid = left + (right - left) / 2;
if(mid <= x / mid) {
ans = mid;
left = mid + 1;
} else {
right = mid - 1;
}
}
return ans;
}
总结
适合求 "最大满足条件的值",用闭区间 + 记录答案的写法;乘法容易溢出时优先换成除法判断。
