leetcode 977 有序数组的平方
题目链接:977、有序数组的平方
今日学习:
文章链接:代码随想录纸质版
视频链接:代码随想录b站视频
第一思路:
这道题暴力解法还是很简单的,首先数组有序,因此将数组元素平方之后进行快排就能找出,也是我思路最快的一次😂。
第二思路:看完视频以及书之后,明白了双指针法在这道题里面的用处,由于数组有序因此最大的数一定是在数组的两侧而不是中间,因此将双指针分别位于数组的两侧,向中间进行靠拢比较,大的数就放入result数组的终止位置(要提前建立好result数组和表示数组下标的k变量),这样就能完成从小到大的排序。
代码实现:
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int k =nums.size() - 1;
vector<int> result(nums.size(),0);
for(int i = 0,j = nums.size() - 1;i <= j;) {
if(nums[i]*nums[i]<nums[j]*nums[j]) {
result[k--] = nums[j]*nums[j];
j--;
}
else{
result[k--] = nums[i]*nums[i];
i++;
}
}
return result;
}
};
这个思路看起来还是蛮简单的,就是第一时间想不出来,要是没有前面那一道双指针的题目引导,那更是想不出来。
至此完成了977的学习,记得提升语法基础。
leetcode 209 长度最小的子数组
题目链接:209、长度最小的子数组
今日学习:
文章链接:代码随想录纸质版
视频链接:代码随想录b站视频
第一思路:
这道题对我来说有点懵,而且今天时间不是很充裕了,因此就直接看了题解的思路
第二思路:看完视频以及书之后,看似叫滑动窗口,实则还是双指针法的应用,首先是创建一个result变量用来返回子数组的长度,然后是创建一个i表示滑动窗口的起始位置,j则表示滑动窗口的终止位置,这样先进行终止位置的遍历,在这个过程中起始位置不变,知道出现sum大于等于target之后,利用while循环,让起始位置不断的向后移动,在此过程中,要判断子数组的长度是否小于result,以便及时更新,同时每一次成功移动之后,都要将sum减去当前初始位置的元素。
如果没有合适的子数组,则返回0。
代码实现:
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int result = INT32_MAX;
int sum = 0;
int i = 0;
int sublength = 0;
for(int j = 0;j <= nums.size() - 1;j++) {
sum += nums[j];
while(sum >= target) {
sublength = j - i + 1;
result = result < sublength ? result : sublength;
sum -= nums[i++];
}
}
return result == INT32_MAX ? 0 : result;
}
};
思路很巧妙,一定要二刷一遍,以此巩固知识。
至此完成了209的学习,记得提升语法基础。