977 有序数组的平方
1.此题唯一的难点就是如何判断负数的平方,所以通过数组开头和数组结尾不断的比较,因为是有序数组,如果负数的平方比结尾的大,就将平方的值放到结尾,然后依次比较,最后得出的就是平方后的有序数组
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int k=nums.size();
vector<int>result(k);
for(int i=0, j=k-1,pos=k-1;i<=j;)
{
if(nums[i]*nums[i]>nums[j]*nums[j])
{
result[pos]=nums[i]*nums[i];
++i;
}
else{
result[pos]=nums[j]*nums[j];
--j;
}
--pos;
}
return result;
}
};
209长度最小的子数组
1.不断累加数值,如果总和大于或等于目标值,则取目标值长度为end-start+1,然后减去开头的数直到sum总值小与target,min取得的是最短的符合目标值的长度
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int n=nums.size();
if(n==0)
{
return 0;
}
int ans=INT_MAX;
int start=0,end=0;
int sum=0;
while(end<n)
{
sum+=nums[end];
while(sum>=target)
{
ans=min(ans,end-start+1);
sum-=nums[start];
start++;
}
end++;
}
return ans==INT_MAX?0:ans;
}
};
59螺旋矩阵
1.因为我们已知我们要生成n*n的矩阵,所以我们要绕n/2圈,如果是奇数就在最后面的中心点min补上最后的数
2整个螺旋矩阵由四个循环组成,x指针和y指针控制分别通过循环控制填入坐标,循环的大体内容分为四种
第一种:(j=starty;j<n-offset;j++)
从x轴开始累加到n-1,也就是边界,每转完一圈边界就减一
第二种:(i=startx;i<n-offset;i++)
从y开始累加n-1
第三种:(;j>starty;j--)
从x轴边界开始位置递减
第四种:(;i>startx;i--)
从y轴边界开始递减
class Solution {
public:
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 count=1;
int offset=1;
int i,j;
while(loop--)
{
i=startx;
j=starty;
for(j=starty;j<n-offset;j++)
{
res[startx][j]=count++;
}
for(i=startx;i<n-offset;i++)
{
res[i][j]=count++;
}
for(;j>starty;j--)
{
res[i][j]=count++;
}
for(;i>startx;i--)
{
res[i][j]=count++;
}
starty++;
startx++;
offset+=1;
}
if(n%2)
{
res[mid][mid]=count;
}
return res;
}
};