977.有序数组的平方
题目建议: 本题关键在于理解双指针思想
题目链接:. - 力扣(LeetCode)
文章讲解:代码随想录
每次隔一阵子不刷题 看到英文题目都会懵一会儿到底啥意思 差点以为平方完不用sort
看了暴力解文章讲解 发现c++可以直接用sort, 不用调用array object。
直接开写经典双指针,看看会出什么问题。
题解用了
vector<int> result(A.size(),0);
对应Java的
int[] result = new int[A.size()];
实际也可以写成vector<int> result(A.size()); 有没有定义初始化为0都没有区别, 因为使用vector定义int默认初始化都是0。
写的解法是和leecode editorial版本一样 从后往前放result的,用result的index而不是nums的双指针,这样不用compare中间。但定义result的时候忘记自己n的定义是数组最后一个index而不是size了,忘记了n+1导致见证了c++版overflow的bug
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int n = nums.size() - 1;
vector<int> result(n + 1);
int l = 0;
int r = n;
for (int i = n; i >= 0; i--) {
int square;
if (abs(nums[l]) < abs(nums[r])) {
square = nums[r];
r--;
} else {
square = nums[l];
l++;
}
result[i] = square * square;
}
return result;
}
};
查看代码随想录解法 发现c++的for不一定需要放条件判断。java似乎不可以这样,因为一般类似需求都会用while。
209.长度最小的子数组
题目建议: 本题关键在于理解滑动窗口,这个滑动窗口看文字讲解 还挺难理解的,建议大家先看视频讲解。 拓展题目可以先不做。
题目链接:. - 力扣(LeetCode)
文章讲解:代码随想录
能想起滑动窗口的解法 但是能感觉应该会在什么时候吃右边 什么时候吐左边的边界判定卡好一会儿。图省时间 直接看题解再写了
随想录的解法是右边界loop index,看到这里 我想到了 左边界应该就是确认一个最大的符合要求的值,找到了就compare并更新result。看到半截确定思路 直接开写
注意到了 int res = INT_MAX; 和 res = min(res, r - l + 1); 这种调用都是和java不一样的
59.螺旋矩阵II
题目建议: 本题关键还是在转圈的逻辑,在二分搜索中提到的区间定义,在这里又用上了。
题目链接:. - 力扣(LeetCode)
文章讲解:代码随想录
转圈圈,边界处理容易出错。写写看的时候在终止中心处出错了 没fill到 查看视频意识到左闭右开虽然规整 但因为offset会导致最后一个layer的loop都进不去 需要单独fill中心。加上就通过了。
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n, vector<int>(n));
int count = 1;
for (int layer = 0; layer < (n + 1) / 2; layer++) {
for (int i = layer; i < n - layer - 1; i++){
res[layer][i] = count++;
}
for (int i = layer; i < n - layer - 1; i++){
res[i][n - layer - 1] = count++;
}
for (int i = layer; i < n - layer - 1; i++){
res[n - layer - 1][n - i - 1] = count++;
}
for (int i = layer; i < n - layer - 1; i++){
res[n - i - 1][layer] = count++;
}
}
if (n % 2 > 0){
res[n/2][n/2]=count;
}
return res;
}
};
语法积累:
JAVA: int[][] result = new int[n][n];-->C++: vector<vector<int>> result(n, vector<int>(n));
总结
这两天都有点磨叽 三题花了俩小时