977.有序数组的平方
思路
这道题在做完第一遍后意识到了该数组的平方和(原顺序)下可能是一个先递减后递增的数组(满足有负数,且abs(最大的复数)>最小的正数),因此即刻联想到了双指针分别指向数组头和尾,比较,填充,移位三步操作
代码随想录
for
循环的循环变量的自增自减的位置很灵活,要根据目的确定
代码
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
vector<int> results(nums.size(), 0);
int left = 0;
int count = nums.size() - 1;
for (int right = nums.size() - 1; right >= left;) {
if (nums[left]*nums[left] >= nums[right]*nums[right]) {
results[count--] = nums[left]*nums[left];
left++;
}
else {
results[count--] = nums[right]*nums[right];
right--;
}
}
return results;
}
};
209.长度最小的子数组
思路
最开始想到的方法为暴力解法,两层for
循环嵌套,分别记录子数组的起始点和终止点;
result = result < subLength ? result : subLength;
一旦找到短的子序列就break
出第二层终止点的循环,开始改变子数组的起始点
代码随想录
滑动窗口在当时第一遍学的时候印象很深刻,但没有掌握最重要的
sum -= nums[i++]; // 滑动窗口的精髓之处,不断变更(子序列的起始位置)
这样就只需要一个for
循环记录滑动窗口的终止位置即可。
收获
- 滑动窗口
int result = INT32_MAX
利用这段位置可以判断在程序中是否对result
进行了赋值.
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;
59.螺旋矩阵
思路
- 首先需要判断给出正整数n后,生成正方形矩阵时需要转几圈,以圈数作为外层循环
- 内层4组
for
循环分别从正方形框的四条边开始,这里在循环时需要设计一个offset
,因为每个for循环不是循环到正方形的顶点
3. 四组for
循环结束后,对startX, startY, offset
都加一,代表下一层loop
的起始位置变化以及for
循环终止条件的变化
4.n
为奇数时为特殊情况,中间层只有一个数字,需要单独加一段代码逻辑处理;
代码随想录
在对vector<vector<int>> res(n, vector<n, 0>)
初始化时险些出错了
收获
二维数组的初始化方式