Given a sorted array and a target value, return the index if the target is found. If not, return the index where it would be if it were inserted in order.
You may assume no duplicates in the array.
Example 1:
Input: [1,3,5,6], 5
Output: 2
Example 2:
Input: [1,3,5,6], 2
Output: 1
Example 3:
Input: [1,3,5,6], 7
Output: 4
Example 4:
Input: [1,3,5,6], 0
Output: 0
复制代码
给定一个排序数组和一个目标值,若是找到目标,返回索引。若是没有,返回按顺序插入的索引所在的位置。
您能够假定数组中没有重复项。
示例1:
输入:一、三、五、6,5
输出:2
示例2:
输入:(一、三、五、6),2
输出:1
示例3:
输入:1,3,5,6,7
输出:4
示例4:
输入:(一、三、五、6),0
输出:0数组
本题主要是为了找值,若是和目标值相等,就返回下标,若是没有找到,则返回离它最近且小于它的值的下标。本题能够用遍历解决,也能够使用二分法处理。bash
第一种解体方法,按照咱们的思路来编辑,代码以下性能
if (nums.length < 0) {
return 0;
}
for (int i = 0; i < nums.length; i++) {
if (nums[i] >= target) {
return i;
}
}
return nums.length;
复制代码
时间复杂度: 该方案用了一层循环,循环度为n,即T(n)=O(n)优化
空间复杂度: 该方案并无使用额外度空间去存储,因此空间复杂度仍是O(1);ui
第二种解题方法,是使用了二分查找的方式,代码以下: public int searchInsert(int[] nums, int target) { if (nums.length < 0) { return 0; }spa
return serch(nums, 0, nums.length, target);
复制代码
}翻译
private int serch(int[] nums, int start, int end, int target) {code
if (start >= end) {
return start;
}
int mod = (start + end) / 2;
if (nums[mod] == target) {
return mod;
}
if (nums[mod] < target) {
return serch(nums, mod + 1, end, target);
}
if (nums[mod] > target) {
return serch(nums, start, mod, target);
}
return 0;
复制代码
}排序
__时间复杂度__:
该方案用了递归二分查找,即T(n)=O(nlogn)
__空间复杂度__:
该方案并无使用额外度空间去存储,因此空间复杂度仍是O(1);
复制代码
第三种解题方案是针对与第二种解题优化的,递归查找在数据量足够大的状况下,性能略差,因此使用循环来解决递归。代码以下:递归
if (nums.length < 0) {
return 0;
}
int index = 0;
int len = nums.length;
while (index < len) {
int mod = (index + len) / 2;
if (nums[mod] == target) {
return mod;
} else if (nums[mod] > target) {
len = mod;
} else {
index = mod + 1;
}
}
return index;
复制代码
时间复杂度: 该方案用了递归二分查找,即T(n)=O(nlogn)
空间复杂度: 该方案并无使用额外度空间去存储,因此空间复杂度仍是O(1);
本题的大体解法如上所诉,可是能够更改的方式不少,运用循环,二分法来进行对本题的解答。