代码随想录算法训练营第二天 | 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II ,总结
977.有序数组的平方
题目链接
具体实现(C++):
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int left = 0;
int right = nums.size()-1;
vector<int>vector<int> result(right+1);
int i = result.size() - 1;
while(left <= right){
int leftResult = nums[left]*nums[left];
int rightResult = nums[right]*nums[right];
if(leftResult >= rightResult){
result[i--] = leftResult;
left++;
}else{
result[i--] = rightResult;
right--;
}
}
return result;
}
};
时间复杂度:O(n)
空间复杂度:O(n)
209.长度最小的子数组
题目链接
具体实现(C++):
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int left = 0, right = 0;
int sum = 0;
int min_length = 0;
while(right < nums.size()){
for(int i = left; i <= right; i++){
sum += nums[i];
}
if(sum >= target){
min_length = right - left + 1;
left++;
}
right++;
}
return min_length == nums.size() ? 0 : min_length ;
}
};
时间复杂度:O(n),时间复杂度主要是看每一个元素被操作的次数,每个元素在滑动窗后进来操作一次,出去操作一次,每个元素都是被操作两次,所以时间复杂度是 2 × n 也就是O(n)。
空间复杂度:O(1)
59.螺旋矩阵II
题目链接
具体实现(C++):
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n, vector<int>(n, 0)); // 使用vector定义一个二维数组
int count = 1; //所填数字
int i = 0; // 每圈起始位置
int max = n - 1; //每排填多少个
while(max >= 0){
if(max == 0){
res[i][i] = count;
}
else{
for(int j = i ; j < i + max; j++){
res[i][j] = count++;
}
for(int j = i ; j < i + max; j++){
res[j][i + max] = count++;
}
for(int j = i + max ; j > i; j--){
res[i + max][j] = count++;
}
for(int j = i + max ; j > i; j--){
res[j][i] = count++;
}
}
max-=2;
i++;
}
return res;
}
};
时间复杂度:O(n^2)
空间复杂度:O(1)
总结
- 平常眼高手低,C++基本的vector定义都写不明白T.T
- 双指针使用过程中记得要写指针的移动。
- 循环中注意边界条件。
- 时间复杂度的计算。
- 螺旋矩阵只要找到规律(每圈分四次填)以及最后一次特例单独写就ok了,然后其他问题可以根据输出和举例子调整(就是略慢)