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

文章目录

  • 977 有序数组的平方
    • 思路
    • 代码
    • 总结
  • 209 长度最小的子数组
    • 思路
    • 代码
    • 总结
  • 59 螺旋矩阵II
    • 思路
    • 代码
    • 总结

977 有序数组的平方

思路

一开始忘记之前的思路了,看来还是要多复习
这道题也可以理解为双指针。因为原数组是非递减的,所以最左小,最右大,但同时,最左可能是负数,负数最小时,它的绝对值是最大。新数组存的是平方,因此,最大的平方只可能由数组两端的数字生成。

代码

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        // 快慢指针
        // 因为原数组是非递减的,所以最左小,最右大
        // 最左可能是负数,负数最小时,它的绝对值是最大
        // 求的是平方,因此,最大的平方只可能由数组两端的数字生成
        int left = 0;
        int right = nums.size() - 1;
        vector<int> results(nums.size());
        for(int i = nums.size() -1; i >= 0; i--) {
            if (abs(nums[left]) >= abs(nums[right])) {
                results[i] = nums[left] * nums[left];
                left ++;
            }
            else {
                results[i] = nums[right] * nums[right];
                right --;
            }
        }
        return results;
    }
};

总结

  1. 常复习!常复习! 常复习!

209 长度最小的子数组

思路

第一遍自己写的时候,超时了,可能还是因为没有很好地掌握滑动窗口思想
滑动窗口就是用两个指针不断地调节子序列的起始位置和终止位置
用一个for做2个for的工作
for循环里的变量代表着滑动窗口的终止位置
起始位置用动态移动的思路去移动

关键重点在于如何调整窗口起点位置
当窗口内元素之和满足条件时就应该调整起点了。

如果用一个for循环,那么应该表示 滑动窗口的起始位置,还是终止位置。
如果只用一个for循环来表示 滑动窗口的起始位置,那么如何遍历剩下的终止位置?此时难免再次陷入 暴力解法的怪圈。所以
只用一个for循环,那么这个循环的索引,一定是表示滑动窗口的终止位置。

复习后再写还出现了一个错误:
AddressSanitizer: SEGV on unknown address
错误出现原因是下标越界,数组操作中出现的错误,后来发现是没有声明left的初始值,直接right-left,出现错误
在声明变量时,最好再规定一下初始值

代码

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

总结

  1. 重点记忆:只有一个for循环去表示滑动窗口的话,循环的索引是窗口终点位置
  2. 整型最大值:INT32_MAX

59 螺旋矩阵II

思路

循环不变量原则
主要是忘记了一共会循环n/2
螺旋矩阵的规律是,最终生成的是一个n*n的矩阵
如果n是奇数的话,最中间的位置会遍历不到,所以要自己单独赋值

代码

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        // 保持一个固定的规律,be like 前闭后开
        vector<vector<int>> result(n,vector<int>(n,0));
        int loop = n/2;
        int x = 0;
        int y = 0;
        int count = 1;
        int mid = n/2;
        int offset = 1;
        int i,j;
        while (loop --)
        {
            i = x;
            j = y;
            
            for (j = y; j < n - offset; j ++){
                result[x][j] = count;
                count ++;
            }

            for (i = x; i < n - offset; i ++) {
                result[i][j] = count;
                count ++;
            }

            for (; j > y; j--) {
                result[i][j] = count;
                count++;
            }

            for (; i > x; i--) {
                result[i][j] = count;
                count ++;
            }

            x++;
            y++;
            offset ++;
         }

         if (n%2==1){
            result[mid][mid] = count;
         }
        return result;
    }
};

总结

  1. 还是要记忆!!螺旋矩阵的规律

你可能感兴趣的:(代码随想录训练营,算法,矩阵,leetcode)