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

螺旋矩阵

思路:第一次见到题目并没有思路,思考十来分钟后依然没思路,选了答案。

实现过程:使用四个for循环来给四条边依次进行赋值,需要另外设置变量来控制每一圈开始的地方,以及其中需要注意边界条件的处理,这是比较关键的地方,思考不清楚可能会陷入进去。

结论:需要二刷。

代码:

class Solution {
public:
    vector> generateMatrix(int n) {
        int loop = n / 2;
        int mid = n / 2;
        int startx = 0;
        int starty = 0;
        int offset = 1;
        int i,j;
        int count = 1;
        vector> res(n, vector(n, 0));

        while(loop)
        {
            i = startx;
            j = starty;
            for(j = starty;j < n - offset;j++)
            res[startx][j] = count++;
            for(i = startx; i < n - offset;i++)
            res[i][j] = count++;
            for(;j > starty;j--)
            res[i][j] = count++;
            for(;i > startx;i--)
            res[i][j] = count++;

            startx++;
            starty++;
            offset++;
            loop--;
        }

        if(n % 2 != 0)
        res[mid][mid] = n * n;

        return res;
    }
};

977、有序数组的平方

思路:遍历容器,进行平方重新赋值,使用容器自带排序算法完成

代码:

class Solution {
public:
    vector sortedSquares(vector& nums) {
        for(auto &i:nums)
        i = i * i;
        sort(nums.begin(),nums.end());
        return nums;
    }
};

209、长度最小的子数组

思路:一开始的想法是暴力法,接着思考了有没有其他的方法,想法是可以先把里面的最大值找出来,再以最大值为中心寻找两边的数,直到符合题意,结果就是这其中会遗漏许多的情况并没有完全考虑好以失败告终

实现过程:看完答案才知道用滑动窗口的方式进行解决,利用好双指针来控制遍历的起点和终点,再在其中进行条件的判断,先找到最开始就符合题意的区间,接着再慢慢缩小,最后找到最小的。

代码:

class Solution {
public:
    int minSubArrayLen(int target, vector& nums) {
        int result = INT32_MAX;
        int sum = 0;
        int i = 0;
        for(int j = 0;j < nums.size();j++)
        {
            sum += nums[j];
            while(sum >= target)
            {
                int subL = j - i + 1;
                result = min(subL,result);
                sum -= nums[i];
                i++;
            }
        }
        return result == INT32_MAX?0:result;
    }
};

你可能感兴趣的:(算法,矩阵,数据结构)