leetcode刷题之数组NO.2

1.题目

2.解法一:二分法

2.1.思路分析

  • 此题相对上一题只是改动的地方就是在未找到的时候,返回会被插入的位置,因此可以借助二分法的模板。
  • 从逻辑层面来考虑的话,该题的情况只有三种:image因此,我们在代码实现的时候需要将这三种情况都考虑进去,逻辑才是严密的。
  • 对于左边的第一种情况,可以一开始做个比较,如果比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.总结

  • 在思路分析的时候,一定要根据实例来归纳出严密的逻辑,尽可能地保证逻辑的正确性,只有这样才能快速地实现代码,少犯错误,不然有可能越写越乱。
  • 在保证自己逻辑的正确性时,可以采用手动运行代码的方式。
posted @ 2021-11-30 21:14  曼路的个人博客  阅读(24)  评论(0)    收藏  举报