35. Search Insert Position
题目描述和难度
- 题目描述:
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
示例 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
- 题目难度:简单。
- 英文网址:35. Search Insert Position 。
- 中文网址:35. 搜索插入位置 。
思路分析
求解关键:这道题是一个很经典的问题了,也是 LeetCode 第 300 题(最长上升子序列问题) O(logn)
复杂度解法的一个子过程。
- 主要的思想还是二分法,但是在使用二分法的过程中,我们要仔细考察边界的情况。
参考解答
参考解答1
public class Solution {
// 只会把比自己大的覆盖成小的
// 如果有一连串数跟 target 相同,则返回索引最靠前的
// 特例: 3 5 5 5 5 5 5 5 5 5
// 特例: 3 6 7 8
public int searchInsert(int[] nums, int target) {
int len = nums.length;
if (len == 0) {
return -1;
}
if (nums[len - 1] < target) {
return len;
}
int left = 0;
int right = len - 1;
while (left < right) {
int mid = left + (right - left) / 2;
if (nums[mid] < target) {
// nums[mid] 的值可以舍弃
left = mid + 1;
} else {
// nums[mid] 不能舍弃
right = mid;
}
}
return right;
}
public static void main(String[] args) {
int[] nums = {1, 2, 3, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6};
int target = 4;
Solution2 solution2 = new Solution2();
int searchInsert = solution2.searchInsert(nums, target);
System.out.println(searchInsert);
}
}
本篇文章的地址为 https://liweiwei1419.github.io/leetcode-solution/leetcode-0035-search-insert-position ,如果我的题解有错误,或者您有更好的解法,欢迎您告诉我 liweiwei1419@gmail.com 。