【算法训练第二天 | 977.有序数组的平方、209.长度最小的子数组、59.螺旋矩阵II】

977.有序数组的平方

  • 文章链接,视频链接

               文章链接

  • 自己看到题目的第一想法

        思路:双指针法->最大的元素一定在两边->比较出最大的元素后放入新数组->依次比较原数组中的每个元素->新数组的元素从大到小排列->翻转数组

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        vector<int> newnums;
        int slow=0;
        int fast=nums.size()-1;
        while(slow<=fast)
        {
            if(nums[slow]*nums[slow]<nums[fast]*nums[fast])
            {
                newnums.push_back(nums[fast]*nums[fast]);
                fast--;
            }
            else
            {
                newnums.push_back(nums[slow]*nums[slow]);
                slow++;
            }
        }
        reverse(newnums.begin(),newnums.end());
        return newnums;
    }
};//自己写的
  • 看完代码随想录之后的想法

              评价一下自己上边写的,完全就属于没必要,脱裤子放屁了属于是。既然都用reverse了那还不如直接用sort更省事儿。应该创建一个和原来数组大小相同的新数组,新数组每个位置的值单独确定。

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        vector<int> result(nums.size(),0);
        int k=nums.size()-1; //k为新数组的下标
        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];
                k--;
                j--;
            }
            else
            {
                result[k]=nums[i]*nums[i];
                k--;
                i++;
            }
        }
        return result;
    }
};//新写法
  • 自己实现过程中遇到哪些困难

        对vector中的一些函数还是不熟悉,写代码有点啰嗦。

  • 今日收获,记录一下自己的学习时长

                心得:想起来用双指针法了,在存入新数组时想的过于简单了,对新数组中的每个值所对应的位置还是不明确,一股脑的存进去了。

209.长度最小的子数组

  • 文章链接,视频链接

               文章链接

  • 自己看到题目的第一想法

        思路:一开始想用暴力算法,后来想着太麻烦了,看来卡哥的双指针思路,终于能写出来了。

双指针法->数组元素和大于等于目标值->计算当前长度->前指针向后移动->再次计算是否大于等于 目标值->更新长度->后指针向后移动->后指针遍历完最后一个元素输出最小长度。

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int sum=0;
        int i=0;
        int len=INT_MAX;
        for(int j=0;j<nums.size();j++)
        {
            sum+=nums[j];
            while(sum>=target)
            {
                if(j-i+1<len) len=j-i+1;
                sum=sum-nums[i];
                i++;
            }
        }
        return len==INT_MAX? 0:len;
    }
};//看完视频思路写的
  • 看完代码随想录之后的想法

              时间复杂度这个东西没太学明白,还得再看看,总的来说就是把两个for循环简化成一个for循环,j代表的是终止位置

59.螺旋矩阵II

  • 文章链接,视频链接

               文章链接

  • 自己看到题目的第一想法

        思路:模拟螺旋矩阵遍历->确定循环次数->确定每条边的起始和终止位置->对二维数组中每个位置进行赋值->输出数组

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> result(n,vector<int>(n));
        int number=1;
        int a=0;
        int i,j;
        int loop=n/2;
        while(loop--)
        {
            for(int i=a,j=a;j<n-a-1;j++)
            {
                result[i][j]=number++;  
            }
            for(int i=a,j=n-a-1;i<n-a-1;i++)
            {
                result[i][j]=number++;
            }
            for(int i=n-a-1,j=n-a-1;j>a;j--)
            {
                result[i][j]=number++;
            }
            for(int i=n-a-1,j=a;i>a;i--)
            {
                result[i][j]=number++;
            }
            a++;
        }
        if(n%2==1)
        {
            result[n/2][n/2]=n*n;
        }
        return result;
    }
};//自己写的
  • 看完代码随想录之后的想法

     评价一下自己上边写的,一看就是稀里糊涂凑出来的,脑子是乱的,每个变量的含义也不具体。在算头尾的时候不知道拿什么变量来限制,一凑发现行就用了,这个以后要注意,看完视频后修改的代码如下:

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> result(n,vector<int>(n));
        int startx=0; //每次开始的坐标
        int starty=0;
        int count=1; 
        int offset=1;   //每条边限制
        int loop=n/2;   //循环次数
        while(loop--)
        {
            int i=startx;
            int j=starty;
            for(;j<n-offset;j++)
            {
                result[i][j]=count++;
            }
            for(;i<n-offset;i++)
            {
                result[i][j]=count++;
            }
            for(;j>starty;j--)
            {
                result[i][j]=count++;
            }
            for(;i>starty;i--)
            {
                result[i][j]=count++;
            }
            startx++;
            starty++;
            offset++;
        }
        if(n%2==1)
        {
            result[n/2][n/2]=count;
        }
        return result;  
    }
};
  • 自己实现过程中遇到哪些困难

        变量太多容易乱了,不清楚每个变量调节的是啥,稀里糊涂一顿搞。while循环中不要出现固定的值。

  • 今日收获,记录一下自己的学习时长

一些细节问题,比如构造一个二维数组,或者取一个最大值,这种还得自己多积累。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值