代码随想录训练营第二天 | 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;
}
};
分类:
代码随想录
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?