977.有序数组的平方
题目链接 :977.有序数组的平方 独立思路 :先遍历、平方,再sort排序返回时间复杂度 :O(nlog2n) (sort排序的时间复杂度,sort一般采用的是快排的变体)空间复杂度 :O(log2n) (sort排序的递归栈空间)
// 想法:先遍历、平方,再sort排序返回
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
for(int i = 0; i < nums.size(); i++){
nums[i] = nums[i]*nums[i];
}
sort(nums.begin(), nums.end());
return nums;
}
};
另解(双指针) :两个指针分别指向数组两端,对元素进行平方值的比较,较大值放入新数组的最后一个位置,指针也相应后移或前移时间复杂度 :O(n)空间复杂度 :O(n)
//解法2: 双指针归并
class Solution{
public:
vector<int> sortedSquares(vector<int>& nums){
int n = nums.size();
int i = 0, j = n-1;
int pos = n-1; //新数组,从尾巴开始放(从大到小)
vector<int> ans(n, 0);
while(i <= j && pos >= 0){
int x = nums[i]*nums[i];
int y = nums[j]*nums[j];
if(x >= y){
ans[pos--] = x;
i++;
}else{
ans[pos--] = y;
j--;
}
}
return ans;
}
};
209.长度最小的子数组
//独立想法:滑动窗口
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int n = nums.size();
int minlen = n+1;
int left = 0, right = 0;
int sum = 0;
while(right < n){
sum = sum + nums[right];
while(sum >= target){
minlen = min(minlen, right-left+1);
sum = sum - nums[left];
left++;
}
right++;
}
return (minlen==n+1)? 0: minlen; //如果最后minlen=n+1,说明么有符合条件的子数组
}
};
59.螺旋矩阵II
题目链接 :59. 螺旋矩阵II 独立思路 :❌ 没想出来,题目都理解错了,太难了,明天再来做一遍时间复杂度 :O(n2)空间复杂度 :O(1)
//没做出来 看的答案
//重点是螺旋的顺序是:→从左到右→从上到下→从右到左→从下到上
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
int size = n*n;
int left=0, right=n-1, top=0, bottom = n-1;
vector<vector<int>> matrix(n, vector<int>(n));
int num = 1;
while(num <= size){
for(int i = left; i <= right && num <= size; i++){
matrix[top][i] = num++;
}
top++;
for(int i = top; i <= bottom && num <= size; i++){
matrix[i][right] = num++;
}
right--;
for(int i = right; i >= left && num <= size; i--){
matrix[bottom][i] = num++;
}
bottom--;
for(int i = bottom; i >= top && num <= size; i--){
matrix[i][left] = num++;
}
left++;
}
return matrix;
}
};