搜索插入位置
说明
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。
示例 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
提示:
- 1 <= nums.length <= 104
- -104 <= nums[i] <= 104
- nums 为 无重复元素 的 升序 排列数组
- -104 <= target <= 104
来源:力扣(LeetCode) 链接:leetcode.cn/problems/se…
题解
解法一(暴力破解)
public static void main(String[] args) {
int[] nums = new int[]{1,3,5,6};
int target = 1;
System.out.println(demo(nums,target));
}
public static int demo(int[] nums, int target){
//输入: nums = [1,3,5,6], target = 5
//输出: 2
if(nums.length == 0){
return 0;
}
for (int i = 0; i < nums.length; i++) {
if(nums[i] >= target){
return i;
}
}
return nums.length;
}
解法二(二分查找)
思想就是二分查找
这下面是借鉴力扣中大佬的思路
public static void main(String[] args) {
int[] nums = new int[]{1,3,5,6};
int target = 1;
System.out.println(demo(nums,target));
}
public static int demo(int[] nums, int target){
if(nums.length == 0){
return 0;
}
int len = nums.length;
int l = 0, r = len - 1;
//当最小位大于最大位(或者等于),说明已经找到了target的位置
while (l < r) {
//取得中位数
int m = l + (r - l + 1) / 2;
if (nums[m] > target) {
// 1.nums[m] > target必然不符合要求->主动排除向左查找
r = m - 1;
} else {
// 2.否则向右查找(含)
l = m;
}
}
return target > nums[l] ? l + 1 : l;
}