这是我参与更文挑战的第7天,活动详情查看:更文挑战
35. 搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
示例
示例 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
个人思路解析
方式一:暴力法
直接遍历数组,找到目标值对应的位置,返回结果
class Solution {
public int searchInsert(int[] nums, int target) {
// 遍历数组
for (int i = 0; i < nums.length; i++) {
// 根据需求给出相应判断条件
if (nums[i] >= target){
// 当当前元素为目标值或者大于目标值,则返回当前索引值
return i;
}
}
// 全部不符合则目标值大于数组中所有元素,返回数组末尾数索引值 +1
return nums.length;
}
}
复杂度分析
- 时间复杂度:
O(n) - 空间复杂度:
O(1)
提交结果
方式二:二分查找
暴力法虽然简单,不过当数据量逐渐增大的时候,相对应的执行耗时也会大大提升,对于一个有序的数组来说,我们可以使用二分查找来进行一个优化
class Solution {
public int searchInsert(int[] nums, int target) {
// 定义两个指针分别指向数组的首位与末尾
int left = 0;
int right = nums.length - 1;
// 判断目标值是否大于数组末尾元素
if (target > nums[right]){
// 大于则直接返回末尾索引值 +1
return nums.length;
}
// 当left大于或等于right时证明已对比完数组中元素,结束循环
while (left < right){
// 定义中间值
int mid = left + (right - left) / 2;
// 判断中间值是否等于目标值
if (nums[mid] == target){
// 返回当前索引值
return mid;
}else if(nums[mid] < target){
// 当前元素小于目标值,指针右移(最终结果为要插入的位置,这里记得要 +1)
left = mid + 1;
}else{
// 指针左移
right = mid;
}
}
// 返回最终剩余目标索引值
return left;
}
}
复杂度分析
- 时间复杂度:
O(logn) - 空间复杂度:
O(1)
提交结果
题目来源力扣:leetcode-cn.com/problems/se…