LeetCode35 搜索插入位置

78 阅读1分钟

题目

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。

链接:leetcode.cn/problems/se…

示例1:

输入: nums = [1,3,5,6], target = 5

输出: 2

示例 2:

输入: nums = [1,3,5,6], target = 2

输出: 1

示例 3:

输入: nums = [1,3,5,6], target = 7

输出: 4

解题思路

使用二分法

左闭右闭

我们定义target是在一个左闭右闭的区间里,也就是[left, right]。 如果 target 在左区间,即 target < nums[middle],right = middle -1 如果 target 在右区间,即 target > nums[middle],left = middle +1 如果 target == nums[middle],返回 middle 分别处理如下四种情况

  • 目标值在数组所有元素之前 -----> [left, right] = [0, -1]

  • 目标值等于数组中某一个元素 -----> return middle;

  • 目标值插入数组中的位置 [left, right] -----> return right + 1

  • 目标值在数组所有元素之后的情况 [left, right], 因为是右闭区间,所以 -----> return right + 1

代码实现

public class Question35 {
    public static int searchInsert(int[] nums, int target) {
        int left = 0;
        int right = nums.length - 1;
        while (left <= right) {
            int mid = left + ((right - left) / 2);
            if (nums[mid] > target) {
                right = mid - 1;
            } else if (nums[mid] < target) {
                left = mid + 1;
            } else {
                return mid;
            }
        }
        return right + 1;
    }

    public static void main(String[] args) {
        int[] array = new int[]{-1, 0, 3, 5, 9, 12};
        System.out.println(searchInsert(array, 2));
    }
}

参考

代码随想录