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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/search-insert-position
暴力破解法:
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
//1.暴力解法
for(int i=0;i<nums.size();i++)
{
//分别处理如下三种情况
//目标值在数组所有元素之前
//目标值等于数组中某个值
//目标值插入数组中的位置
if(nums[i] >= target){
//一旦发现大于或者等于target的num[i],那么i就是我们要的结果
return i;
}
}
//目标值在数组所有元素之后的情况
return nums.size();//如果target是最大的,或者nums为空,则返回nums的长度
}
};
2.二分法:
确定要查找的区间到底是左闭右开[left,right),还是左闭右闭[left,right],这就是不变量
二分查找的循环中,坚持循环不变量的原则。
解法一:
//2.二分法①
int n = nums.size();
int left = 0;
int right = n - 1;//定义target在左闭右手闭的区间里,[left,right]
while(left <= right){//当left == right,区间[left,right]依然有效
int middle = left + ((right - left) / 2); //防止溢出,等同于(left + right)/2
if(nums[middle] > target ){
right = middle -1; //target在左区间,所以[left,middle-1]
}else if(nums[middle]<target){
left = middle +1; // target在右区间,所以[middle+1,right]
}else { // nums[middle]==target
return middle;
}
}
//分别处理如下四种情况
//目标值在数组所有元素之前 [0,-1]
//目标值等于数组中某个元素 return middle
//目标值插入数组中的位置 [left,right],return right + 1
//目标值在数组所有元素之后的情况 [left,right],return right + 1
return right + 1;
解法二:
//3.二分法②
int n = nums.size();
int left = 0;
int right = n ;//定义target在左闭右闭的区间里,[left,right]
while(left < right){//当left == right,区间[left,right)无效
int middle = left + ((right - left) >>1);
if(nums[middle] > target ){
right = middle ; //target在左区间,所以[left,middle-1]
}else if(nums[middle]<target){
left = middle +1; // target在右区间,所以[middle+1,right]
}else { // nums[middle]==target
return middle;
}
}
//分别处理如下四种情况
//目标值在数组所有元素之前 [0,0)
//目标值等于数组中某个元素 return middle
//目标值插入数组中的位置 [left,right),return right 即可
//目标值在数组所有元素之后的情况 [left,right),return right 即可
return right ;