一、题目概述
二、思路方向
为了实现这一功能,我们可以使用二分查找的变种来找到目标值或确定其应插入的位置。在二分查找过程中,我们不仅检查中间元素是否等于目标值,还根据比较结果更新搜索的上下界。如果目标值大于中间元素,则我们搜索右半部分;如果目标值小于中间元素,则我们搜索左半部分。如果搜索结束后仍未找到目标值,那么左边界(left)指向的位置就是目标值应该被插入的位置(如果数组按非递减顺序排序)。
三、代码实现
public class Solution {
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) {
return mid; // 找到目标值,返回索引
} else if (nums[mid] < target) {
left = mid + 1; // 搜索右半部分
} else {
right = mid - 1; // 搜索左半部分
}
}
// 如果没有找到目标值,left 的位置就是插入位置
// 循环结束时 left > right,由于 left 是从 mid+1 更新来的,因此 left 是第一个大于 target 的数的位置
// 如果 target 大于数组中的所有数,left 将会是 nums.length(此时相当于插入在数组末尾)
// 如果 target 小于数组中的所有数,left 将会是 0(此时相当于插入在数组开头)
return left;
}
public static void main(String[] args) {
Solution solution = new Solution();
int[] nums = {1, 3, 5, 6};
int target = 5;
System.out.println(solution.searchInsert(nums, target)); // 输出: 2
target = 2;
System.out.println(solution.searchInsert(nums, target)); // 输出: 1
target = 7;
System.out.println(solution.searchInsert(nums, target)); // 输出: 4
target = 0;
System.out.println(solution.searchInsert(nums, target)); // 输出: 0
}
}
执行结果:
四、小结
这个解决方案确保了时间复杂度为 O(log n),因为它采用了二分查找的思想,每次都将搜索范围减半,直到找到目标值或确定其应插入的位置。
结语
不甘平庸
不甘堕落
!!!