代码随想录算法训练营day2

 977.有序数组的平方 

双指针分别指向负数和非负,比较大小移动指针

要考虑全正/全负特殊情况

class Solution {
public:
    vector sortedSquares(vector& nums) {
        int p=0;
        while (p square_nums;
        if (p>0) {
            int n=p-1;
            while (n>=0 && p0) {
                    square_nums.push_back(pow(nums[n--],2));
                }
                else {
                    square_nums.push_back(pow(nums[p++],2));
                }
            }
            if (n<0) {
                while (p=0) {
                    square_nums.push_back(pow(nums[n--],2));
                }
            }
        }
        else {
            while (p

 209.长度最小的子数组

class Solution {
public:
    int minSubArrayLen(int target, vector& nums) {
        /* 暴力解法 O(n^2)
        int least_len=INT_MAX;
        for (int i=0; i=target) {
                least_len = j-i+1 < least_len? j-i+1 : least_len;
            }
            if (least_len == 1) {
                return 1;
            }
        }
        if (least_len == INT_MAX) {
            return 0;
        }
        return least_len; */


        //滑动窗口
        int i=0;
        int sum=0;
        int least_len = INT_MAX;
        for (int j=0; j=target) {
                least_len = j-i+1 < least_len? j-i+1 : least_len;
                sum-=nums[i];
                i++;
            }
        }
        return least_len == INT_MAX? 0 : least_len;
    }
};

写过的题果然不看一遍解析还是完全想不起来滑动窗口的逻辑。常写常新。

重点:(引自代码随想录)

只用一个for循环,那么这个循环的索引,一定是表示 滑动窗口的终止位置。

 59.螺旋矩阵II

最开始自己写的时候确实是思路不清晰,看了解析,总结重点在遵循左闭右开

class Solution {
public:
    vector> generateMatrix(int n) {
        vector> res(n, vector(n, 0));

        int a=n; //当前圈的边长
        int cnt=1;
        int num_cyc = 0;
        while (a>0) {
            int i=0;
            for (; i

反思:把四边放在一个循环里了,其实逻辑没分开写清晰。感觉变量a也多余了 可以用num_cyc来表示的,下次写的时候可以优化一下。

你可能感兴趣的:(算法)