977.有序数组的平方
笔记
双指针法:从两边开始遍历,选出平方值较大的数,从数组的后面开始插入。
心得
一开始想的是用两个指针从中间开始遍历,但是麻烦很多,代码还是简洁的好,应该多尝试反向思考。
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int left = 0;
int right = nums.size() - 1;
vector<int> result(nums.size(), 0);
int i = nums.size() - 1;
while (left <= right) {
if (nums[left] * nums[left] < nums[right] * nums[right]) {
result[i] = nums[right] * nums[right];
i--;
right--;
}
else {
result[i] =nums[left] * nums[left];
i--;
left++;
}
}
return result;
}
};
209. 长度最小的子数组
笔记
双指针法:快指针指向子数组的上边界,慢指针指向子数组的下边界,当sum < target
时,快指针右移,当sum >= target
时慢指针右移直到sum < target
。
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int fast = 0;
int slow = 0;
int result = INT32_MAX;
int sum = 0;
for (fast = 0; fast < nums.size(); fast++) {
sum += nums[fast];
while (sum >= target) {
result = (fast - slow + 1) < result ? (fast - slow + 1) : result;
sum -= nums[slow];
slow++;
}
}
return result == INT32_MAX ? 0 : result;
}
};
59. 螺旋矩阵 II
笔记
一次循环走一个圈,细节是每次单向遍历要预留一个位置,用于下一次单向遍历,这样边界条件比较统一,容易判断。
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> result(n, vector<int>(n, 0));
int offset = 0;
int loop = n / 2;
int i, j;
int val = 1;
while (loop--) {
i = offset;
j = offset;
for (j = offset; j < n - offset -1; j++) {
result[i][j] = val;
val++;
}
for (i = offset; i < n - offset - 1; i++) {
result[i][j] = val;
val++;
}
for (j = n - offset - 1; j > offset; j--) {
result[i][j] = val;
val++;
}
for (i = n - offset - 1; i > offset; i--) {
result[i][j] = val;
val++;
}
offset++;
}
if (n%2 == 1) result[n/2][n/2] = val;
return result;
}
};