代码随想录算法训练营第二天||977.有序数组的平方 ||209.长度最小的子数组||59.螺旋矩阵II

 977.有序数列的平方

题目链接:977. 有序数组的平方 - 力扣(LeetCode)

学习视频地址:双指针法经典题目 | LeetCode:977.有序数组的平方_哔哩哔哩_bilibili

看到此题的一个想法:因为数组是非降序排列,所以同时对两边元素的平方大小进行对比,所以我们要使用双指针法。

实现中遇到的困难:

因为笔者刚开始学习stl,对vector容器的使用并不熟练,所以在新数组的创建上出了一点问题。算法思想是明白的。

看完代码随想录的收获:对if循环条件有更深刻的认识,不要随便乱添加判断语句,有时会出现一些缺少判断的情况。促进了我对vector容器的学习。

源代码:

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
int k=nums.size()-1;
vector<int> Arr(nums.size(),0);
int i=0;
int j=nums.size()-1;
for(;i<=j;){
    if(nums[i]*nums[i]<nums[j]*nums[j]){
        Arr[k--]=nums[j]*nums[j];
        j--;
    }else{
        Arr[k--]=nums[i]*nums[i];
        i++;
    }
}
return Arr;
    }
};

209.长度最小的子数组

题目链接:209. 长度最小的子数组 - 力扣(LeetCode)

学习视频链接:拿下滑动窗口! | LeetCode 209 长度最小的子数组_哔哩哔哩_bilibili

看到这个题的第一个想法:暴力解法。但是LeetCode直接显示超时了。

实现中遇到的困难:没有想到创造一个储存结果的变量。没有想去判断length和result的大小,直接输出length了出现了很大的问题。对c++语法不是很熟悉。

看完代码随想录的收获:学会了新的判断方式。学会了滑动窗口的本质。

源代码:

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
int result =INT32_MAX;//结果
int sum=0;//和
int length=0;//长度
int i=0;
for(int j=0;j<=nums.size()-1;j++){//j表示的是快指针
sum+=nums[j];
while(sum>=target){
length=j-i+1;
result=result>length?length:result;
sum-=nums[i++];
}
}
return result==INT32_MAX?0:result;
    }
};

59.螺旋矩阵

题目链接:59. 螺旋矩阵 II - 力扣(LeetCode)

视频链接:一入循环深似海 | LeetCode:59.螺旋矩阵II_哔哩哔哩_bilibili

看到题目的第一想法:想到了要控制边界,然后依次循环每一个边。

实现遇到的困难:想不出循环的次数,对边界没有设限。

看完代码随想录得到的收获:对模拟过程有了一个新的认识,对边界的把控有了新的理解

源代码:

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
    //用两个变量存放起始位置
int startx=0;
int starty=0;
    //一个存放最中间的坐标,一个存放边界值
int offset=1;
int mid=n/2;
int count=1;
vector<vector<int>>nums(n,vector<int>(n,0));
int i,j;
int loop=n/2;
while(loop--){//循环次数
i=startx;
j=starty;
for(;j<n-offset;j++){
    nums[i][j]=count++;
}
for(;i<n-offset;i++){
    nums[i][j]=count++;
}
for(j;j>starty;j--){
     nums[i][j]=count++;
}
for(i;i>startx;i--){
     nums[i][j]=count++;
}
offset++;
startx++;
starty++;
}
if(n%2){
    nums[mid][mid]=count;
}
return nums;
    }
};

对数组的总结:

常用方法:

1.二分法:

使用二分法的时候,要对循环的边界有明确的认定,要先确定是“左闭右闭”oder“左闭右开”等等,严格遵守循环不变量原则。

时间复杂度:O(logn)

2.双指针法:

可以在一个for循环下完成两个for循环得工作

时间复杂度:O(n)

3.滑动窗口:

能根据自序列的大小不断调整起始位置

时间复杂度:O(n)

4.模拟行为:

考察对“循环不变量”的遵守。

今日收获:学会了移动窗口,理解了模拟行为的实现。

学习时长:3小时左右,螺旋矩阵让我有点头疼。写博客也花了不少时间。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值