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和博客园所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.


posted @ 2018-03-16 16:35  AlvinZH  阅读(242)  评论(2编辑  收藏  举报