LeetCode 搜索插入位置

66 阅读3分钟

LeetCode 搜索插入位置

搜索插入位置(Search Insert Position)是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

解题思路

由于给定数组是一个有序数组,所以我们可以使用二分查找算法来解决这个问题。当目标元素在数组中不存在时,我们需要找到它在数组中应该插入的位置。在二分查找的过程中,找到当前元素后,如果当前元素等于目标元素,则返回当前的位置;如果当前元素小于目标元素,则向右继续查找;如果当前元素大于目标元素,则向左继续查找。最终,当左右指针相遇时,如果当前指针所在位置的元素小于目标元素,则该目标元素的下一个位置就是它应该插入的位置;如果当前指针所在位置的元素大于等于目标元素,则当前指针所在位置就是目标元素应该插入的位置。

举个例子,我们假设有一个有序数组[1, 2, 3, 5, 6],目标元素为4。首先,我们初始化左右指针分别指向数组的起始和末尾位置。然后,我们根据中间位置的值5与目标元素4进行比较,发现5大于4,因此我们向左移动右指针,使得右指针指向元素3。此时,左指针和右指针都指向了元素3,因此我们再次进行比较。发现元素3依然大于目标元素4,因此我们再次移动右指针,将右指针指向元素2。此时,左指针和右指针都指向了元素2,通过比较我们发现元素2依然大于目标元素4,因此我们再次移动右指针,将右指针指向元素1。此时,左指针和右指针都指向了元素1,因此我们再次进行比较,发现元素1小于目标元素4,因此我们将目标元素插入到元素1后面的位置,也就是第4个位置。

代码实现

public 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) {
            left = mid + 1;
        } else if (nums[mid] > target) {
            right = mid - 1;
        } else {
            return mid;
        }
    }
    return left;
}

总结

通过这篇文章,我们学习了如何使用二分查找算法解决Leetcode的搜索插入位置问题。在解决该问题时,我们需要根据目标元素是否在数组中出现来决定最终需要返回的下标。如果目标元素已经在数组中出现,则返回它在数组中的下标。如果目标元素在数组中不存在,则返回它将要插入的位置的下标。