【Java】力扣 - 刷题笔记 - 35
描述
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。
示例 1:
输入: nums = [1,3,5,6], target = 5
输出: 2
示例 2:
输入: nums = [1,3,5,6], target = 2
输出: 1
代码
代码一
暴力破解法: 时间复杂度:O(n) 空间复杂度:O(1)
class Solution {
//暴力解法 时间复杂度:O(n) 空间复杂度:O(1)
public int searchInsert(int[] nums, int target) {
/*
四种情况:
1.目标值在所有元素之前
2.目标值等于某个元素
3.目标值插入到数组中某个位置
4.目标值在所有元素之后
*/
for (int i = 0; i < nums.length; i++) {
//1.目标值在所有元素之前
//2.目标值等于某个元素
//3.目标值插入到数组中某个位置
if (target <= nums[i]) {
return i;
}
}
//4.目标值在所有元素之后
return nums.length;
}
}
代码二
二分法查找:时间复杂度:O(logn) 空间复杂度:O(1)
class Solution {
/*
由于题目描述中包含:nums 为无重复元素的升序排列数组
所以我们可以采用 二分法
因为一旦有重复元素,使用二分查找法返回的元素下标就可能不是唯一的。
*/
public int searchInsert(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
while (left <= right) {
int middle = left + ((right - left) / 2);
if (target < nums[middle]) {
right = middle - 1;
} else if (target > nums[middle]) {
left = middle + 1;
} else {
return middle;
}
}
return right + 1;
/*
分别处理四种情况:
1.目标值在所有元素之前 [0,0] return 0
2.目标值在等于某个元素 return middle
3.目标值插入到数组的位置 [left,right] return middle
4.目标值在所有元素之后 return nums.lenght
*/
}
}