确实是太菜了,这几道数组明明是之前做过的,现在做起来因为很多细枝末节的地方汗流浃背了。
977.有序数组的平方
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
vector<int> result = nums;
int k=nums.size()-1;
for (int i=0, j=nums.size()-1; i<=j;){
if (nums[i]*nums[i] < nums[j]*nums[j]){
result[k--] = nums[j]*nums[j];
j--;
}
else{
result[k--] = nums[i]*nums[i];
i++;
}
}
return result;
}
};
其实不难,问题在于想不清楚双指针的工作区间,如果不让i<=j,而是i<j,当数组为奇数个时,最简的那个元素就无法被加入result;
209.长度最小的子数组
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int sum=0;
int minSubLen = INT32_MAX;
int i=0;
for (int j=0; j<nums.size(); j++){
sum+=nums[j];
while(sum>=target){
if (minSubLen > j-i+1)
minSubLen=j-i+1;
sum-=nums[i];
i++;
}
}
return minSubLen == INT32_MAX? 0:minSubLen;
}
};
一开始想用一个循环节解决这个问题,但是实际上是不可能的。因为这个问题是两个集合的问题,分别是在nums[]中寻找一个满足sum>=target的子串,以及在这个子串中找到sum>=target的最小子串。
59.螺旋矩阵II
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> matrix(n, vector<int>(n));
int startX = 0, startY = 0;
int offset=1;
int counter=1;
int i=0, j=0;
int loop = n/2;
while(loop--){
for (j=startY; j<n-offset; j++){
matrix[startX][j] = counter++;
}
for (i=startX; i<n-offset; i++){
matrix[i][j] = counter++;
}
for (; j>startY; j--){
matrix[i][j] = counter++;
}
for (; i>startX; i--){
matrix[i][startY] = counter++;
}
startX++;
startY++;
offset++;
}
if (n%2==1){
matrix[startX][startY]=counter++;
}
return matrix;
}
};
看清范围,这里用的是左开右闭,正好每个for循环最终的结果就是下一个for循环的起点。
i>startX;i–本来就少循环一次了,正常递减应该是i>=startX;i–;循环startX次;