第二天的任务
977.有序数组的平方
代码随想录:有序数组的平方
力扣链接977
视频讲解:https://www.bilibili.com/video/BV12A4y1Z7LP
这一题主要用到双指针的方法,注意输出result是vector的建立,同时暴力解法,时间复杂度的差异,暴力时间复杂度是 O(n + nlogn),双指针是O(n).
209.长度最小的子数组
代码随想录:209.长度最小的子数组
力扣链接977
视频讲解:https://www.bilibili.com/video/BV1tZ4y1q7XE
class Solution {
public:
int minSubArrayLen(int s, vector<int>& nums) {
int result = INT32_MAX;
int sum = 0; // 滑动窗口数值之和
int i = 0; // 滑动窗口起始位置
int subLength = 0; // 滑动窗口的长度
for (int j = 0; j < nums.size(); j++) {
sum += nums[j];
// 注意这里使用while,每次更新 i(起始位置),并不断比较子序列是否符合条件
while (sum >= s) {
subLength = (j - i + 1); // 取子序列的长度
result = result < subLength ? result : subLength;
sum -= nums[i++]; // 这里体现出滑动窗口的精髓之处,不断变更i(子序列的起始位置)
}
}
// 如果result没有被赋值的话,就返回0,说明没有符合条件的子序列
return result == INT32_MAX ? 0 : result;
}
};
这一题主要是主要是滑动窗口的方法,主要是控制终止位置,需要注意点
1:result的初始值要为最大值INT32_MAX,因为最终的结果可能为最大值,如果设置为比INT32_MAX小的,就不会比较出结果了。
2:result = result < subLength ? result : subLength;这个的意思,先比较result < subLength 吗?如果小于(取真)则取 ? 后面的第一个数result,再赋值给最左侧的result,如果不小于(假)则取 :后面的subLength,再赋值给最左侧的result.
3.这里判断是while (sum >= s),而不是if,因为又可能sum -= nums[i++]之后,sum还是sum >= s,所以要不断进循环,如果是if就直接结束里面的小循环了。
4.暴力解法也要试一试
59.螺旋矩阵II
题目建议: 本题关键还是在转圈的逻辑,在二分搜索中提到的区间定义,在这里又用上了。
题目链接:https://leetcode.cn/problems/spiral-matrix-ii/
文章讲解:https://programmercarl.com/0059.%E8%9E%BA%E6%97%8B%E7%9F%A9%E9%98%B5II.html
视频讲解:https://www.bilibili.com/video/BV1SL4y1N7mV/
本题目就是锻炼代码能力,用在我身上正合适。59题专门针对nn的方阵,对于mn的矩形阵并不适用,我总结出如下的通用格式的版本;
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n,vector<int>(n,0));
int left = 0;//左边界
int right = n - 1;//有边界
int up = 0;//上
int down = n - 1;//下
int count = 1;//计数
while(true) {
for(int i = left; i <= right; i++) {//向右走到边
res[up][i] = count++;
}
up++;//准备向下,加1
if(up > down) break;//判断能不能向下
for(int i = up; i <= down; i++) {//向下走
res[i][right] = count++;
}
right--;
if (left > right) break;
for(int i = right; i >= left; i--) {//向左
res[down][i] = count++;
}
down--;
if(up > down) break;
for(int i = down; i >= up; i--) {//向上
res[i][left] = count++;
}
left++;
if(left > right) break;
}
return res;
}
};