leetcode刷题之数组NO.2
1.题目
2.解法一:二分法
2.1.思路分析
- 此题相对上一题只是改动的地方就是在未找到的时候,返回会被插入的位置,因此可以借助二分法的模板。
- 从逻辑层面来考虑的话,该题的情况只有三种:
因此,我们在代码实现的时候需要将这三种情况都考虑进去,逻辑才是严密的。 - 对于左边的第一种情况,可以一开始做个比较,如果比nums[0]小的话直接返回0;对于右边的一种情况,可以和左边的一个逻辑;对于中间的一种情况,在二分查找完毕后,会有
[left,right] = [0,-1]的结果,因此只需要返回right+1就可以了(使用实例想出来的,不得不说数学归纳法是个好东西)。
2.2.代码实现
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int left = 0;
int right = nums.size()-1;
while (left <= right) {
int middle = (left + right) / 2;
if (target < nums[middle]) {
right = middle - 1;
} else if (target > nums[middle]) {
left = middle + 1;
} else {
return middle;
}
}
return right+1;
}
};
3.总结
- 在思路分析的时候,一定要根据实例来归纳出严密的逻辑,尽可能地保证逻辑的正确性,只有这样才能快速地实现代码,少犯错误,不然有可能越写越乱。
- 在保证自己逻辑的正确性时,可以采用手动运行代码的方式。
本文来自博客园,作者:曼路的个人博客,转载请注明原文链接:https://www.cnblogs.com/manlujun/articles/15626280.html

因此,我们在代码实现的时候需要将这三种情况都考虑进去,逻辑才是严密的。
浙公网安备 33010602011771号