1. 有序数组的平方
力扣题号:977.有序数组的平方
还是双指针,但是最重要的一定是left <= right
,因为要处理最后一个元素。
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
vector<int> result(nums.size(), 0);
int left = 0, right = nums.size() - 1;
int k = result.size() - 1;
while (left <= right) { // 注意这里一定要left <= right, 要不最后一个元素处理不了
if(abs(nums[left]) > abs(nums[right])) {
result[k--] = (nums[left] * nums[left]);
left++;
}
else {
result[k--] = (nums[right] * nums[right]);
right--;
}
}
return result;
}
};
2. 长度最小的子数组
力扣题号:209. 长度最小的子数组
还是双指针,其实这道题有了思路就很好做了。
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int slow = 0, fast = 0;
int sum = 0;
int minLength = INT32_MAX;
while (fast < nums.size()) {
sum += nums[fast];
fast++;
while (sum >= target) {
sum -= nums[slow];
slow++;
minLength = (fast - slow + 1) < minLength ? (fast - slow + 1) : minLength; // 另外注意这里fast - slow + 1
}
}
if (minLength == INT32_MAX) return 0; // 这里经常会漏,注意要加上是否存在这样的数组
return minLength;
}
};
3. 螺旋矩阵 II
力扣题号:59. 螺旋矩阵 II
这里我用的方法跟代码随想录的可能不太一样,我自己觉得这个在面对非方阵时也是同样的方法,思路也会清晰一点。
这个做法最容易错的地方在于自增/自减顺序与>
和>=
的匹配。**自增在前无等号,自增在后有等号!**这个题一定要反复看,现已加入豪华复习套餐。
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> result(n, vector<int>(n, 0)); // 注意:这里别漏了把矩阵形状先声明出来,虽然很低级但是这也是犯过的错
int left = 0, right = n - 1, top = 0, bot = n - 1; // 设置第一轮次要处理的边的位置
int cnt = 1;
while (true) {
for (int i = left; i <= right; i++) { result[top][i] = cnt++; } // 遍历上边缘
if (++top > bot) { break; } // 1. 注意这里:因为自增在前,所以一定要top一定要严格大于bot才能退出。
// 如果++top >= bot的话,因为自增在前,top == bot时最中间那一行还没处理,会出现0.
for (int i = top; i <= bot; i++) { result[i][right] = cnt++; }
if (--right < left) { break; } // 2. 如果想用 <= 怎么办呢?很简单,把自增/自减运算放到判等之后。
// 也即: right-- <= left,这样也是可以的
for (int i = right; i >= left; i--) { result[bot][i] = cnt++; }
if (--bot < top) { break; } // 3. 反正记住:自增在前无等号
for (int i = bot; i >= top; i--) { result[i][left] = cnt++; }
if (++left > right) { break; }
}
return result;
}
};