前言
我是debug的神
参加了卡哥的算法训练营班,今天是第二天,继续掌握二分双指针。
虽然都自己写出来了,但还是debug了好久,继续坚持
双指针
977.有序数组的平方
977.有序数组的平方
文章讲解
视频讲解
状态 :AC
一开始想写双指针的,但想了好久还是妥协了(我好菜www)
直接暴力过(全部平方+排序)
后来看了卡哥讲解之后,恍然大悟:
数组其实是有序的, 只不过负数平方之后可能成为最大数了。
那么数组平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间。
然后就很快把双指针搓出来了XD
感觉还是不太熟练,懂这个算法但不会用的感觉
- AC代码示例:
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
vector<int>ans(nums.size(),0);
int n=nums.size()-1,l=0,r=n;
while(l<=r){
long long left=nums[l]*nums[l],right=nums[r]*nums[r];
if(left>=right){
ans[n--]=left;
l++;
}else{
ans[n--]=right;
r--;
}
}
return ans;
}
};
- 时间复杂度:O(n)
- 空间复杂度:O(1)
209.长度最小的子数组
209.长度最小的子数组
文章讲解
视频讲解
状态 :AC
刚开始看漏条件了,没见到连续的子序列条件(血的教训一定要看清题)
然后再写,从分类入手(
滑窗没学过,就想暴力,暴力超时,然后慢慢优化双指针
再看讲解,原来滑窗也,双指针的一种啊,但还是叫滑窗更好(
然后就很快过了
- AC代码示例:
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int slow=0,fast=0;
int ans=1e9,cur=0;
while(fast<nums.size()){
cur+=nums[fast];
while(cur>=target){
int sum=fast-slow+1;
ans=min(sum,ans);
cur-=nums[slow++];
}
fast++;
}
return ans==1e9? 0:ans;
}
};
- 时间复杂度:O(n)
- 空间复杂度:O(1)
模拟
59.螺旋矩阵II
一看题目就懂意思,感觉很简单,刷刷刷搓代码开始模拟,然后报错(
然后看半天还不行,放到VSCode上Debug过了,什么面向IDE编程()
这个题目跟昨天的二分边界条件判断很相似,要么左闭右开,要么左开右闭
在每个拐角处一定要坚持左闭右开/左开右闭的原则
- AC代码示例:(Debug半天,感觉自己写的一坨…)
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int> >ans(n,vector<int >(n,0)) ;
int cur=0,s=0,x=0,z=0,y=0;
int i=0,j=0;
while(cur<n*n){
//从左到右
for(j;j<n-y;j++){
ans[i][j]=cur+1;
cur++;
}
j--;
s++;
i++;
//从上到下
for(i;i<n-x;i++){
ans[i][j]=cur+1;
cur++;
}
i--;
y++;
j--;
//从右到左
for(j;j>=z;j--){
ans[i][j]=cur+1;
cur++;
}
j++;
x++;
i--;
//从下到上
for(i;i>=s;i--){
ans[i][j]=cur+1;
cur++;
}
i++;
z++;
j++;
}
return ans;
}
};
- 时间复杂度 O(n^2): 模拟遍历二维矩阵的时间
- 空间复杂度 O(1)
总结
棒棒棒加油加油坚持坚持
2024-4-18