(一)分析暴力法做题思路:
存在四种情况:
①目标值=数组内某元素,返回该元素的位置
②目标值≠数组内任一元素,返回插入位置
③目标值<数组内最小元素,返回0
④目标值>数组内最大元素,返回最后的位置(nums的长度)
暴力法代码
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
for (int i = 0; i < nums.size(); i++) {
if (nums[i] >= target) {
return i;
}
}
return nums.size();
}
};
时间复杂度:O(n)
空间复杂度:O(1)
(二)分析二分法做题思路:
二分查找基础条件:有序数组
例如在这个数组中,使用二分法寻找元素为5的位置,并返回其下标。
二分法代码(1)
定义 target 是在一个在左闭右闭的区间里[left,right]
分别处理如下四种情况
①目标值在数组所有元素之前 [0, -1]
②目标值等于数组中某一个元素 return middle;
③目标值插入数组中的位置 [left, right],return right + 1
④目标值在数组所有元素之后的情况 [left, right], return right + 1
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int n =nums.size();
int left = 0;
int right = n-1;
while(left <= right){
int middle = left+((right-left)/2);
// 防止溢出 等同于(left + right)/2
if (nums[middle] > target) {
// target 在左区间,所以[left, middle - 1]
right = middle - 1;
}
else if(nums[middle] < target){
// target 在右区间,所以[middle + 1, right]
left = middle + 1;
}
else{ //num[middle] = target
return middle;
}
}
return right + 1;
}
};
时间复杂度:O(logn)
空间复杂度:O(1)
二分法代码(2)
定义 target 是在一个在左闭右开的区间里[left,right)
分别处理如下四种情况
①目标值在数组所有元素之前 [0,0)
②目标值等于数组中某一个元素 return middle
③目标值插入数组中的位置 [left, right) ,return right 即可
④目标值在数组所有元素之后的情况 [left, right),return right 即可
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int n = nums.size();
int left = 0;
int right = n;
while (left < right) {
int middle=left+((right-left)>>1);
if (nums[middle] > target) {
right = middle;
} else if (nums[middle] < target) {
left = middle + 1;
} else { // nums[middle] == target
return middle;
}
}
return right;
}
};
时间复杂度:O(logn)
空间复杂度:O(1)