给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
示例 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
示例 4:
输入: nums = [1,3,5,6], target = 0
输出: 0
解题思路
如果该题目暴力解决的话需要 O(n) 的时间复杂度,但是如果二分的话则可以降低到 O(logn)的时间复杂度
二分查找,先设定左侧下标 left 和右侧下标 right,再计算中间下标 mid
每次根据 nums[mid] 和 target 之间的大小进行判断,相等则直接返回下标,nums[mid] < target 则 left 右移,nums[mid] > target 则 right 左移
查找结束如果没有相等值则返回 left,该值为插入位置
二分查找法:时间复杂度O(logn)
class Solution {
public int searchInsert(int[] nums, int target) {
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;//则将left指向中间索引
} else {//如果中间索引大于目标值
right = mid - 1;则将right指向中间索引
}
}
return left;
}
}
普通方法:时间复杂度O(n)
import java.util.Arrays;
class Solution {
public int searchInsert(int[] nums, int target) {
int i;
int nums2[]=new int[nums.length+1];;
for( i=0;i<nums.length;i++) {
if(nums[i]==target) {//找到目标值
return i;
}else {//目标值不存在于数组中
for(int a=0;a<nums.length;a++) {
nums2[a]=nums[a];
}
if(nums[i]>target) {
//将目标值存到数组中
for(int j=nums2.length-1;j>=i;j--) {
nums2[j]=nums2[j-1];
}
nums2[i]=target;
System.out.println(Arrays.toString(nums2));
return i;
}else if(i==nums.length-1){
//将值存放到数组末尾
nums2[nums2.length-1]=target;
System.out.println(Arrays.toString(nums2));
return i+1;
}
}
}
return i;
}
public static void main(String[] args) {
Solution s=new Solution();
int[] nums=new int[] {1,3,6,7,8,10};
int target=11;
/*int[] nums=new int[] {1,3,5,6};
int target=2;
*/
System.out.println(s.searchInsert(nums, target));
}
}
运行结果: