春招打卡d10n16-leetcode刷题35搜索插入位置

88 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

leetcode刷题35搜索插入位置

前文

本文为leetcode遍历类型问题,题目序号为35,主要考察遍历时的效率问题。

题目信息

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 O(log n) 的算法。

解题思路

根据题目信息,很容易想到通过遍历得到结果。但由于题目中有时间复杂度的要求,因此本文采用二分法的方式处理。首先要对一些特殊情况进行单独的处理。此后,每次都获取数组的中间节点,判断目标数据落在数组的哪部分,再将该部分作为新的数据进行二分操作。重复以上步骤,直至数组的长度等于2或找到目标数值,即可得到解体的方案。利用这种方式,满足了对于时间复杂度的要求,能够达到最高的执行效率。

解题代码

public int searchInsert(int[] nums, int target) {
    return searchPos(nums,0,nums.length - 1,target);
}

public int searchPos(int[] nums, int begin,int end,int target){
    int length = end - begin + 1;
    if(length == 0){
        return 0;
    }
    if(length == 1){
        if(nums[begin] == target){
            return begin;
        }
        return nums[begin] < target ? begin + 1 : begin;
    }
    if(length == 2){
        if(target == nums[begin]){
            return begin;
        }else if(target == nums[end]){
            return end;
        }else if(target > nums[begin] && target < nums[end]){
            return end;
        }else if(target < nums[begin]){
            return begin;
        }else{
            return end + 1;
        }
    }else{
        int middle = (int) Math.floor((begin + end)/2);
        if(nums[middle] > target){
            return searchPos(nums,begin,middle,target);
        }else if(nums[middle] < target){
            return searchPos(nums,middle,end,target);
        }else {
            return middle;
        }
    }
}

后记