035.搜索插入位置-二哥 LeetCode刷题笔记
鲁迅曾说,人生就是一个曲折不断的过程,你可能正在向上求索,但成绩却不尽如人意。甚至这个时候还有人在背后捅你一刀,怎么办呢?这时候只能继续坚持,熬过去就对了。就像今天这道题,仍然是二分查找搜索插入位置,来吧,向前继续冲吧。
题意
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。
难度
简单
示例
输入: nums = [1,3,5,6], target = 5
输出: 2
输入: nums = [1,3,5,6], target = 2
输出: 1
输入: nums = [1,3,5,6], target = 7
输出: 4
分析 1
同样,在不考虑时间复杂度的情况下,我们来看一下这道题的解法。
①、如果目标值在数组中,那就是直接遍历数组,找到和 target 相等的元素,返回索引即可。
②、如果目标值不在数组中,题目要求返回插入的位置,那么由于数组是排序过的(默认都是正序),那么第一个大于 target 的元素位置,就是 target 应该插入的位置。
class Solution {
public int searchInsert(int[] nums, int target) {
for (int i = 0; i < nums.length; i++) {
if (nums[i] >= target) {
return i;
}
}
return nums.length;
}
}
直接一个 for 循环 + 一个 if 判断,就搞定了,并且仍然能击败 100% 的 Java 用户。
分析 2
不过,题目仍然要求我们使用时间复杂度为 O(log n) 的算法,那就需要使用二分查找了。
试试 Arrays.binarySearch()
方法吧,如果找到了,直接返回索引,如果没找到,返回 -index - 1
,这个值就是 target 应该插入的位置。
class Solution {
public int searchInsert(int[] nums, int target) {
int index = Arrays.binarySearch(nums, target);
return index >= 0 ? index : -index - 1;
}
}
为什么 -index - 1
就是 target 应该插入的位置呢?
来看一下 Arrays.binarySearch()
的源码:
public static int binarySearch(int[] a, int key
热门评论
1 条评论
回复