- 题目
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。 如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 - 示例
示例 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的元素位置,即插入位置。所以直接遍历数组,找到第一个大于等于target的元素位置就是结果。但本题要求时间复杂度为log(n),那么需要进行优化。
- 方法二:二分查找。算法思路:将数组分成两份,left=0,mid=(left + right) / 2,right=length-1。根据mid与target的大小,进一步划分区域。如果mid>target,说明target在0到mid之间。反之,在mid到length-1之间。将范围缩小(left = mid + 1 或 right = mid - 1 ), 继续比较。本题可以用二分查找的思想,不过算法是查找相等数据,本题需要查找第一个大于等于的数据。
- 这里说明下为什么以left进行返回:
本题结果即找到第一个大于等于target的元素。在二分查找的过程中,遇到的第一个mid对应元素,大于target时,mid对应的元素不一定是第一个大于target元素,只是二分查找过程中遇到的第一个。此时需要继续缩小范围就继续比较。
那么什么情况下是第一个呢?首先mid对应元素和target相等的时候直接返回mid位置,即插入位置。大于的情况,因为数组中不存在target,那么一定会遍历到left==right==mid的时候,如果这个元素大于target,根据二分查找算法原理,此时right = mid - 1,left>right跳出循环,left即结果;如果这个元素小于target,left = mid+1,left>right跳出循环,left即结果(已经加1)。这里不管是大于还是小于,mid的其他位置都是已经确认了大于或小于target了。那么如果这个位置小于target,那么它后面的就是第一个大于target的,如果这个位置大于target那么他就是第一个大于target的。
- 这里说明下为什么以left进行返回:
- 代码(Java)
// 方法一 class Solution { public int searchInsert(int[] nums, int target) { if (nums == null || nums.length == 0) { return -1; } if (nums[0] > target) { return 0; } if (nums[nums.length - 1] < target) { return nums.length; } for (int i = 0; i < nums.length; i++) { if (nums[i] >= target) { return i; } } return nums.length; } }// 方法二 class Solution { public int searchInsert(int[] nums, int target) { if (nums == null || nums.length == 0) { return -1; } if (nums[0] > target) { return 0; } if (nums[nums.length - 1] < target) { return nums.length; } int left = 0; int right = nums.length - 1; while (left <= right) { int mid = (left + right) / 2; if (nums[mid] == target) { return mid; } else if (nums[mid] < target) { left = mid + 1; } else { right = mid - 1; } } return left; } }
LeetCode25 搜索插入位置
最新推荐文章于 2025-12-01 17:13:03 发布
441

被折叠的 条评论
为什么被折叠?



