977.有序数组的平方
之前刷过1-2遍,本题要求时间复杂度,所以不能暴力解法(暴力无意义
考察双指针,创建一个新的vector,双指针指向首尾,谁的平方大谁进新vector,然后往对方方向移动,直到两个指针相遇(相遇时也要判断,这是最后一个元素)
std::reverse函数的时间复杂度也为O(N)
总而言之,属于双指针里比较好想的
209.长度最小的子数组
以前也做过,一开始想成了动态规划,后来想起来这是为数不多的滑动窗口qwq
变相双指针的题目,两个指针作为一个窗口,右移时加上新进窗口的值,左移时减去离开窗口的值,再引入一个结果判断当前窗口大小即可,一遍AC
59.螺旋矩阵
这题倒是第一次做,之前看到过,一直没刷,太绕了,做起来确实很绕,是一个很需要细心判断初始条件和退出循环的题目,绕晕啦。
外层大循环判断循环次数,内层四个小循环依次修改最上边、最下边、最左边、最右边对应行列的元素,保证每次循环变量不变(代码逻辑要对),类似一种遍历,这个题估计以后还得重做加深加深印象。
ps:和答案的代码大致逻辑一致
相关代码:
977.有序数组的平方
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int left = 0;
int right = nums.size() - 1;
vector<int> newnums;
while (left <= right) {
if (nums[right] * nums[right] > nums[left] * nums[left]) {
newnums.push_back(nums[right] * nums[right]);
right--;
}
else {
newnums.push_back(nums[left] * nums[left]);
left++;
}
}
reverse(newnums.begin(),newnums.end());
return newnums;
}
};
209.长度最小的子数组
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int left = 0;
int right = 0;
int result = INT_MAX;
int tempSum = 0;
while (left <= right) {
if (tempSum < target) {
if (right == nums.size()) break;
tempSum += nums[right++];
}
else {
if (right - left < result) result = right - left;
tempSum -= nums[left++];
}
}
return result == INT_MAX ? 0 : result;
}
};
59.螺旋矩阵
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
int point = 1;
vector<vector <int>> result(n, vector<int>(n,0));
for (int i = 0; i < n / 2 + 1; i++) {
// 一共循环n/2次
for (int j = i; j < n - i; j++) {
result[i][j] = point++;
}
for (int j = i + 1; j < n - i; j++) {
result[j][n - i - 1] = point++;
}
for (int j = n - i - 2; j >= i; j--) {
result[n - i - 1][j] = point++;
}
for (int j = n - i - 2; j > i; j--) {
result[j][i] = point++;
}
}
return result;
}
};