返回

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

前端



    ** Day 2
    
    -   977. 有序数组的平方
        -   给你一个按非递减顺序排列的整数数组 nums,返回一个由数组 nums 中的元素依次按绝对值从大到小排列得到的数组。
        -   思路:双指针法
        -   代码:
        ```cpp
        vector<int> sortedSquares(vector<int>& nums) {
            int n = nums.size();
            vector<int> res(n);
            int l = 0, r = n - 1;
            for (int i = n - 1; i >= 0; i--) {
                if (abs(nums[l]) < abs(nums[r])) {
                    res[i] = nums[r] * nums[r];
                    r--;
                } else {
                    res[i] = nums[l] * nums[l];
                    l++;
                }
            }
            return res;
        }
        ```

    -   209. 长度最小的子数组
        -   给你一个正整数数组 nums 和一个整数 k ,请你找出 nums 中的最短连续子数组,其和至少等于 k。如果不存在这样的子数组,返回 0 。
        -   思路:滑动窗口法
        -   代码:
        ```cpp
        int minSubArrayLen(int target, vector<int>& nums) {
            int n = nums.size();
            int l = 0, r = 0;
            int sum = 0;
            int minLen = INT_MAX;
            while (r < n) {
                sum += nums[r];
                while (sum >= target) {
                    minLen = min(minLen, r - l + 1);
                    sum -= nums[l];
                    l++;
                }
                r++;
            }
            return minLen == INT_MAX ? 0 : minLen;
        }
        ```

    -   59. 螺旋矩阵 II
        -   给你一个正整数 n ,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix。
        -   思路:模拟
        -   代码:
        ```cpp
        vector<vector<int>> generateMatrix(int n) {
            vector<vector<int>> matrix(n, vector<int>(n, 0));
            int num = 1;
            int top = 0, bottom = n - 1, left = 0, right = n - 1;
            while (top <= bottom && left <= right) {
                for (int i = left; i <= right; i++) {
                    matrix[top][i] = num++;
                }
                for (int i = top + 1; i <= bottom; i++) {
                    matrix[i][right] = num++;
                }
                if (top < bottom) {
                    for (int i = right - 1; i >= left; i--) {
                        matrix[bottom][i] = num++;
                    }
                }
                if (left < right) {
                    for (int i = bottom - 1; i > top; i--) {
                        matrix[i][left] = num++;
                    }
                }
                top++;
                bottom--;
                left++;
                right--;
            }
            return matrix;
        }
        ```