每日一道算法题 011 搜索插入位置

454 阅读1分钟

题目

leetCode 第 35 题,搜索插入位置 关联类型:数组

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

你可以假设数组中无重复元素。

示例 1:

输入: [1,3,5,6], 5
输出: 2

示例 2:

输入: [1,3,5,6], 2
输出: 1

示例 3:

输入: [1,3,5,6], 7
输出: 4

示例 4:

输入: [1,3,5,6], 0
输出: 0

做题时间

class Solution {
    public int searchInsert(int[] nums, int target) {
        
        
        
    }
}

以上给出方法输入参数,完成作答。

题目分析

  1. 这题看到题目,第一个想到的应该是二分查找
  2. 但是里面应该注意一些临界点,比如示例 3 和 4,需要多留意
  3. 然后用递归调用的方式进行查找

解答分析

本文只分析本人做题思路,仅供参考,了解一种解题思想,其他各种做题思路请上网查阅。

解答成功:
执行耗时:0 ms,击败了100.00% 的Java用户
内存消耗:38.2 MB,击败了45.11% 的Java用户

class Solution {
    public int searchInsert(int[] nums, int target) {
        return binarySearch(nums, target, 0, nums.length - 1); //调用下面二分查找方法进行查找位置
    }
    
    public int binarySearch(int[] nums, int target, int start, int end) {
        if (end<=start) { //临界点判定
            if (target <= nums[start]) {//返回具体坐标
                return start;
            } else if (target > nums[start]) {//比最大的都大,返回长度+1
                return start + 1;
            }
        }
        //下面就是常规二分查找的调用
        int middle = (end - start) / 2 + start;
        if (nums[middle] == target) {
            return middle;
        } else if (nums[middle] > target) {
            return binarySearch(nums, target, start, middle - 1);
        } else
            return binarySearch(nums, target, middle + 1, end);
        }
    }
}