LeetCode 35. Search Insert Position
问题链接
LeetCode 35. Search Insert Position
题目解析
在有序数组中寻找目标值。如果成功找到,则返回其索引下标;否则返回其应该插入的位置下标。
解题思路
看到在有序的数组中寻找目标,第一应该想到 二分。本题比较简单,直接二分即可。当然先排除一些边界条件更好理解。
二分有很多种形式,循环条件、修改边界、取中间值的方式都是需要注意的。代码中,采用最朴素的写法,循环结束条件是 \(left <= right\),中间值为 \((left + right) / 2\),在这种二分写法下,mid总是偏向左边的。
- 如果目标值存在数组中,则每次循环开始时,目标值一定在 \([left, right]\) 中,可以保证寻找正确。
- 如果目标值不存在数组中,则最后一刻一定会有left==right的情况,此时进行最后一次判断,若小于目标则 left+1、right 不变 且退出循环,目标界与right和left之间,返回left;若大于目标则 left 不变、right-1 退出循环,目标界还是与right和left之间,同样是返回left。
参考代码
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
if(nums.empty()) return 0;
if(nums[0] > target) return 0;
int len = nums.size();
if(nums[len-1] < target) return len;
int left = 0, right = len-1;
while(left <= right) {
int mid = (left + right) / 2;
if(nums[mid] > target)
right = mid-1;
else if(nums[mid] < target)
left = mid+1;
else
return mid;
}
return left;
}
};
暴力解法
当然对于本题,直接暴力也可以AC,虽然这肯定不是面试官想要的答案,但是简单易懂啊,还可以过题呀!
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
for (int i = 0; i < nums.size(); i++) {
if (nums[i] >= target) return i;
}
return nums.size();
}
};
LeetCode All in One题解汇总(持续更新中...)
本文版权归作者AlvinZH和博客园所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.