LeetCode 搜索插入位置

搜索插入位置

这也是数组系列的一道题,先看下题目。
搜索插入位置

题目要求时间复杂度O(log n),而且相关标签页提示了用二分查找。在没做题前,O(log n)这种算法就是时间减半,说白了就是二分查找法。那么既然思路已经确定了,那么就差实现代码了。来看看我的代码

public int searchInsert(int[] nums, int target) {
        // 起始位置
        int start = 0;
        // 结束位置
        int end = nums.length - 1;
        // 返回结果
        int result = 0;

        for (int i = 0; i < nums.length; i++) {
            // 计算中心点
            int mid = (start + end ) / 2;
            // 找到目标参数,返回下标
            if(nums[mid] == target){
                result = mid;
                break;
            }
            // 如果中心点对应数字大于目标数字,则把结束位置收缩到中心点前一个位置
            // 例:[1,2,3,4,5,6,7,8,9] mid=4 target=3 收缩后,其实就可以看成是[1,2,3,4] end就指到了4的位置
            else if(nums[mid] > target){
                end = mid-1;
            }
            // 与结束位置同理,把开始位置提到中心点后一个位置
            else if(nums[mid] < target){
                start = mid+1;
            }
            // 最后一次循环,处理没找到的情况
            if(i == nums.length - 1){
                // 目标数小于最后一个数,说明应该在数组中,这时其实正好等于起点位置。
                if(target < nums[nums.length-1]){
                    result = start;
                }else{
                    // 目标数字大于数组最大值或小于最小值。
                    //小于返回0,大于返回数组长度(数组长度正好比数组最大index大1,符合最大数插入数组的index)。
                    result = nums[mid] > target ? 0 : nums.length;
                }
            }
        }

        return result;
    }

leetCode结果
具体实现可以看看代码,每行基本上都已经添加到了注释。基本思路就是把代码分成两部分,第一部分就是能在数组中找到目标数。第二部分就是找不到目标数。
第二部分又分了两种情况:

  1. 目标数小于数组最大数,在数组中。
  2. 目标数大于数组最大数,或小于数组最小数。

看LeetCode的提交结果,也证明了我这种写法是正确的。

越发觉得做算法题有意思,尤其是当有目标和思路,并克服了问题时,整个人都会处于一种愉悦的状态。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值