977.有序数组的平方
题解
vector<int> sortedSquares(vector<int>& nums) {
int left = 0, right = nums.size() - 1;
vector<int> result(nums.size());
int k = nums.size() - 1;
while (left <= right) {
if (nums[left] * nums[left] >= nums[right] * nums[right]) {
result[k--] = nums[left] * nums[left];
left++;
}
else {
result[k--] = nums[right] * nums[right];
right--;
}
}
return result;
}
总结
双指针法,用两个指针分别指向原数组头尾,头尾指针指向的元素平方后比较大小,更大的元素会被加到新数组中。始终搜寻更大的元素,指针移动的逻辑是:当前指向元素更大的指针在此元素被加入到新数组后,朝着另一个指针移动一步,两个指针往中间移动,两个指针相遇错开以后,原数组遍历结束。
209.长度最小的子数组
题解
int minSubArrayLen(int target, vector<int>& nums) {
int min_length = INT_MAX;
int slow = 0, fast = 0;
int cur_sum = 0;
for (; fast < nums.size(); fast++) {
cur_sum += nums[fast];
while (cur_sum >= target) {
min_length = min(min_length, fast - slow + 1);
cur_sum -= nums[slow++];
}
}
return (min_length == INT_MAX) ? 0: min_length;
}
总结
本题依旧是双指针法,或者更形象的说叫滑动窗口,fast用于收集数组元素,当slow到fast区间内数组元素之和大于等于target时候,记录此时窗口大小,让slow移动,使窗口收缩,尝试找到更小的窗口。
59.螺旋矩阵2
题解
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> result(n, vector<int>(n));
int count = 1;
int offset = 1;
int x_start = 0, y_start = 0;
int loop = n/2;
while (loop--) {
int i = x_start, j = y_start;
for (; j < n - offset; j++) result[i][j] = count++;
for (; i < n - offset; i++) result[i][j] = count++;
for (; j >= offset; j--) result[i][j] = count++;
for (; i >= offset; i--) result[i][j] = count++;
x_start++;
y_start++;
offset++;
}
if (n % 2 == 1) result[n/2][n/2] = count;
return result;
}
总结
在填充矩阵每一圈的四条边时严格遵守循环不变量原则即可。
数组总结
今天没有多余时间了,这里留着等后面有时间了,再来更新吧。