977.有序数组的平方
文档讲解:代码随想录.有序数组的平方
视频讲解:双指针法经典题目 | LeetCode:977.有序数组的平方
状态:已完成
代码实现
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int k = nums.size() - 1;
vector<int> out_put(nums.size(), 0);
for (int left = 0, right = nums.size() - 1; left <= right;) {//等号是为了保证最中间的可以提取
if (nums[left] * nums[left] > nums[right] * nums[right]) {
out_put[k--] = nums[left] * nums[left];
left++;
} else {
out_put[k--] = nums[right] * nums[right];
right--;
}
}
return out_put;
}
};
心得记录:
- 灵活的使用双指针,并且注意for循环的终止条件
209.长度最小的子数组
文档讲解:代码随想录.长度最小的子数组
视频讲解:拿下滑动窗口! | LeetCode 209 长度最小的子数组
状态:已完成
代码实现
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int result = INT32_MAX;
int sub_length = 0;
int sum = 0;
int left = 0;
for (int right = 0; right < nums.size(); right++) {
sum += nums[right];
while (sum >= target) { // 重点理解窗口移动时的处理逻辑,忘记等于号了
sub_length = (right - left + 1);
result = result < sub_length ? result : sub_length;
sum -= nums[left++];
cout << "left is " << left << ", right is " << right << endl;
}
}
return result == INT32_MAX ? 0 : result;
}
};
心得记录:
- 在处理的时候,对于两个窗口变化的原理理解不到位,导致忘记了等号
- result = result < sub_length ? result : sub_length; C++ 条件运算符 ()的理解
59.螺旋矩阵II
文档讲解:代码随想录…螺旋矩阵II
视频讲解:一入循环深似海 | LeetCode:59.螺旋矩阵II
状态:已完成
代码实现
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n, vector<int>(n, 0));
int startx = 0, starty = 0;
int loop = n / 2;
int mid = n / 2; // 控制矩阵中间的位置
int count = 1; // 控制每个值的长度
int offset = 1; // 控制每个边的便利长度
int i, j;
while (loop--) {
i = startx;
j = starty;
// 开始进行转圈
for (j; j < n - offset; j++) {
res[i][j] = count++;
}
for (i; i < n - offset; i++) {
res[i][j] = count++;
}
for (j; j > starty; j--) {
res[i][j] = count++;
}
for (i; i > startx; i--) {
res[i][j] = count++;
}
// 第二次遍历之前,更新起点位置
startx++;
starty++;
offset++;
}
// 如果n为奇数的话,需要单独给矩阵最中间的位置赋值
if (n % 2) {
res[mid][mid] = count;
}
return res;
}
};
心得记录:
- 忘记返回值了,导致多次提交报错
- 没有时间做了,对着代码敲了一遍,明天手动自己写一遍