力扣刷题笔记1:数组
题目一;搜索插入位置:

这是一道很简单的题目,首先想法就是从头到尾遍历数组,直到找到比目标值大的数,返回其在数组中位置-1即可,但是如果目标值在数组最后,时间复杂度就会有你n,所以我使用了二分查找法,可以减少时间复杂度,
代码如下:
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);
if (nums[middle] > target) {//如果中间值大于目标值,更新左指针
right = middle - 1;
} else if (nums[middle] < target) {//如果中间值小于目标值,更新右指针
left = middle + 1;
} else {
return middle;
}
}
return right + 1;//目标值大于数组中任意数,把目标值插入尾部
}
};
题目二;移除元素:

这题比较简单,就不做解释,代码如下

注意:vector调用erase函数后会返回指向被删除元素的下一个迭代器
题目三;删除排序数组中的重复项:

这道题目和上题很像,我直接放代码了:

题目四;有序数组的平方

这道题同样很简单,只需从头到尾遍历数组并求平方,最后调用sort函数即可
代码如下:

题目五;长度最小的子数组:

解题思路和代码如下:
class Solution {
public:
int minSubArrayLen(int s, vector<int>& nums) {
int i=0,j=0,temp=0;
if(!nums.size()) return 0; //如果数组为空,肯定不满足
int b=INT_MAX; //将b定义为整形最大值,用来保存满足条件的子数组大小
while(j!=nums.size()){ //从头到尾遍历数组并依次累加
temp+=nums[j];
j++;
while(temp>=s)
{
b=min(b,j-i); //如果累加后的结果>=目标值,计算新的子数组大小并和前面保存的b进行比较,将小的那个数值赋值给b
temp-=nums[i];
i++; //从头到尾依次删除子数组中元素,直到累加后结果<目标值,跳出子循环,继续累加
}
}
if(b==INT_MAX) return 0; //如果此时的b依然还是INT_MAX,就算将数组中的数都相加都不会大于等于目标值,所以返回0;
else return b; //此时b就是满足条件的最短数组的长度
}
};
浙公网安备 33010602011771号