代码随想录算法训练营第二天
977.有序数组的平方
题目链接: 977.有序数组的平方
数组取平方后数值从两侧向中间递减,创建两侧双指针计算平方值后比较,创建新数组将较大的放在新数组的最后
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int size = nums.size();
vector<int> new_num(size,0);
int left = 0;
int right = size - 1;
int i = size-1;
while (left <= right) {
if ((nums[left] * nums[left]) > (nums[right] * nums[right])) {
new_num[i] = nums[left] * nums[left];
left++;
} else {
new_num[i] = nums[right] * nums[right];
right--;
}
i--;
}
return new_num;
}
};
209.长度最小的子数组
题目链接: 209.长度最小的子数组
创建一个子数组,从0开始扩展右边界,子数组内所有元素求和,如果小于目标值,扩展右边界,增大子数组长度,如果大于等于目标值就减去左侧值,移动左边界,缩小数组长度,每缩小一次更新一下最小值,如果最后数组所有值佳和都小于目标值就返回0
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int sum = 0;
int left = 0;
int min_len = nums.size()+1;
int len = 0;
int right = 0;
for(int right = 0;right<nums.size();right++){
sum+=nums[right];//一开始我把len的更新在这也写了一次发现,数组长度增加时无需改变len,本来也要求的是最短。
while(sum>=target){
sum-=nums[left];
len = right-left +1;
left++;
min_len=min(min_len,len);
}
}
if(min_len>nums.size())return 0;
return min_len;
}
};
59.螺旋矩阵II
题目链接:59.螺旋矩阵II
定义4个边界,然后一圈一圈往内转
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
int left =0;
int top = 0;
int right =n-1;
int down = n-1;
int count = 1;
vector<vector<int>> nums(n, vector<int>(n));
while(down>top){
for (int j = left;j<right;j++){
nums[top][j]=count;
count++;
}
for(int i=top;i<down;i++){
nums[i][right] = count;
count++;
}
for(int j = right;j>top;j--){
nums[down][j] = count;
count++;
}
for(int i = down;i>top;i--){
nums[i][left] = count;
count++;
}
top++;
down--;
left++;
right--;
}
if(n%2==1){
nums[n/2][n/2]=n*n;
}
return nums;
}
};
总结
数组在内存中是连续的片段,容易访问,不易删减