Leetcode977.有序数组的平方
1.思路
对于有序数组的平方,最大平方在数组的两侧,所以使用双指针,从数组的前后分别对比,得到依次的最大平方,并将每次选出的“最大平方”存在新容器result中(注意要求非递减,所以从result末尾开始插入)。停止条件为i>j,所以用一个while(i<=j)来进行控制循环。
2.代码实现
vector<int> sortedSquares(vector<int>& nums) {
int k=nums.size()-1;
int i=0,j=k;
vector<int> result(k+1,0);
while(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;
}
3.复杂度分析
时间复杂度:O(n)
空间复杂度:O(n)
4.Reference:代码随想录
Leetcode209.长度最小的子数组
1.思路
滑动窗口:
滑动窗口就是不断调整窗口的起始位置和终止位置得到我们要的结果
只用一个for循环,那么这个循环的索引一定表示滑动窗口的终止位置
重要三点:
1.窗口内是什么?
窗口内是满足其和>=s的连续子数组
2.如何移动窗口的起始位置
当当前窗口的和>=s,就可以缩短窗口,即找更小满足条件的子数组
3.如何移动窗口的终止位置
遍历数组,利用for循环进行移动
2.代码实现
int minSubArrayLen(int target, vector<int>& nums) {
int result=INT32_MAX;
int i=0;
int sum=0;//滑动窗口内数值之和
int sublength=0;//滑动窗口的长度
for(int j=0;j<nums.size();j++){
sum+=nums[j];
while(sum>=target){
sublength=j-i+1;//取子序列长度
result=result>sublength?sublength:result;
sum-=nums[i++];//不断更新i
}
}
//若没有满足条件的子序列,就返回0
return result==INT32_MAX?0:result;
}
3.复杂度分析
时间复杂度:O(n)
空间复杂度:O(1)
4.Reference:代码随想录
Leetcode59.螺旋数组||
1.思路
重点:坚持循环不变量原则(左闭右开)
模拟顺时针画矩阵的方法:
1.填充上行从左到右
2.填充右列从上到下
3.填充下行从右到左
4.填充左列从下到上
重要变量:
startx,starty:定义每一圈循环的起始变量
loop:总共要循环多少圈
offset:需要控制每一条边遍历的长度,每次需要收缩1
mid:矩阵的中间位置
count:用来给矩阵的每一个空格赋值
2.代码实现
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>>res(n,vector<int>(n,0));
int startx=0,starty=0;
int loop=n/2;
int mid=n/2;
int offset=1;
int count=1;
int i,j;
while(loop--){
i=startx;
j=starty;
//填充上行
for(;j<(n-offset);j++){
res[i][j]=count++;
}
//填充右列
for(;i<(n-offset);i++){
res[i][j]=count++;
}
//填充下行
for(;j>starty;j--){
res[i][j]=count++;
}
//填充左列
for(;i>startx;i--){
res[i][j]=count++;
}
//到下一圈,起始位置都要加1
startx++;
starty++;
//边界也要收缩1
offset++;
}
//如果n为奇数,则最中间的要单独填充
if(n%2==1){
res[mid][mid]=count;
}
return res;
}
3.复杂度分析
时间复杂度:O(n^2)
空间复杂度:O(1)