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

977.有序数组的平方

题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/
文章讲解:https://programmercarl.com/0977.有序数组的平方.html
视频讲解: https://www.bilibili.com/video/BV1QB4y1D7ep

暴力解

  • 时间复杂度 O(nlogn)
  • 空间复杂度 O(1)

双指针法

  • 时间复杂度 O(n)
  • 空间复杂度 O(n)
    tips
// 暴力解
#if 0
class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        for(auto it = nums.begin(); it != nums.end(); ++it) *it = (*it) * (*it);
        sort(nums.begin(), nums.end());
        return nums;
    }
};
#else
// 双指针
class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        vector<int> ans(nums.size());
        int idx = nums.size() - 1;
        int left = 0, right = nums.size() - 1;
        while (left <= right) {
            if(nums[left] * nums[left] < nums[right] * nums[right]) {
                ans[idx--] = nums[right] * nums[right];
                right--;
            } else {
                ans[idx--] = nums[left] * nums[left];
                left++;
            }
        }
        return ans;
    }
};

#endif

209.长度最小子数组

题目链接:https://leetcode.cn/problems/minimum-size-subarray-sum/
文章讲解:https://programmercarl.com/0209.长度最小的子数组.html
视频讲解:https://www.bilibili.com/video/BV1tZ4y1q7XE

滑动窗口

难点:虽然知道用滑动窗口来解,但是如何确定窗口的边界却花了比较多的时间
tips: 对于滑动窗口问题无非就是不满足条件的时候增加窗口,满足条件时缩减窗口

  • 时间复杂度 o(n)
  • 空间复杂度 o(1)
class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int left = 0, right = 0;
        int min_len = INT_MAX;
        int size = nums.size();
       
        int count = 0; // 窗口内所有数的和
        while(right < size) {
            
            count += nums[right];
            // 满足条件时缩减窗口
            while(count >= target && left <= right) {
                if(right - left + 1 < min_len) min_len = (right - left + 1);
                count -= nums[left];
                ++left;
            }
            // 不满足条件时不断增大窗口
            ++right;         
        }
        return min_len == INT_MAX ? 0 : min_len;
    }
};

59.螺旋矩阵II

题目链接:https://leetcode.cn/problems/spiral-matrix-ii/
文章讲解:https://programmercarl.com/0059.螺旋矩阵II.html
视频讲解:https://www.bilibili.com/video/BV1SL4y1N7mV/
难点:主要是边界问题

  • 时间复杂度 o(n2)
  • 空间复杂度 o(n2)
class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        int row_begin = 0, row_end = n - 1;
        int col_begin = 0, col_end = n - 1;
        int elem = 1;
        // 初始化二维数组
        vector<vector<int>> ans;
        ans.resize(n);
        for(int num = 0; num < n; ++num) ans[num].resize(n);
        int size = ans.size() * ans[0].size();
        // 使用元素个数来控制循环次数
        while (elem <= size) {
            for(int i = col_begin; i <= col_end && elem <= size; ++i) ans[row_begin][i] = elem++;
            ++row_begin;
            for(int j = row_begin; j <= row_end && elem <= size; ++j) ans[j][col_end] = elem++;
            --col_end;
            for(int k = col_end; k >= col_begin && elem <= size; --k) ans[row_end][k] = elem++;
            --row_end;
            for(int l = row_end; l >= row_begin && elem <= size; --l) ans[l][col_begin] = elem++;
            ++col_begin;
        }
        return ans;     
    }
};
posted @ 2024-05-10 14:05  深蓝von  阅读(3)  评论(0编辑  收藏  举报