目录
有序数组的平方
两种方法
1、暴力:依次平方后再sort ,复杂度O(n+nlogn)
2、平方后中间一定是元素最小的位置,所以使用双指针从两头出发,新建一个空数组从最后出发
int k=A.size()-1;
vector<int> ans(A.size(),0);
for(int i=0,j=nums.size()-1;i<=j) //这里是等于号,因为要处理最后两个数,当i==j时i和j两个数才能被分别处理到
{
if(A[i]*A[i]<A[j]*A[j])
{
ans[k--]=A[j]*A[j];
j--;
}
else
{
ans[k--]=A[i]*A[i];
i++;
}
}
return ans;
长度最小的子数组
螺旋矩阵
模拟类
坚持循环不变量原则。
vector<vector<int>> ans(n,vector<int>(n,0));
int startx=0,starty=0;
int loop=n/2; //共循环几圈
int mid=n/2;//最中间位置
int count=1;
int offset=1; //用来控制循环位置,每次循环边界收缩一位
int i,j;
while(loop--){
i=startx;
j=starty;//这两个数值是用来控制每一圈的起始位置
//四个循环,分别代表四个圈
//模拟上行的从左到右
for(j=starty;j<n-offset;j++)
{
ans[startx][j]=count++;
}
//模拟填充右侧从上到下
for(i=startx;i<n-offset;i++)
{
ans[i][j]=count++;
}
//模拟下行从右到左
for(;j>starty;j--)
{
ans[i][j]=count++;
}
//模拟左侧从下到上
for(;i>startx;i--)
{
ans[i][j]=count++;
}
//第二圈开始的时候,起始位置要各自加一
startx++;
starty++;
offset++;
}
//如果是奇数n,要单独给最里面的数赋值
if(n%2)
{
ans[mid][mid]=count;
}
return ans;
}
类似题目
-
54.螺旋矩阵
-
剑指Offer 29.顺时针打印矩阵