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


  • 相关阅读:
    第七次上机练习
    第六次作业
    第六次上机练习
    第五次作业
    第五次上机练习
    第四次作业
    第四次上机练习
    第三次上机练习
    第三次作业
    第十一周上机练习
  • 原文地址:https://www.cnblogs.com/AlvinZH/p/8583188.html
Copyright © 2011-2022 走看看