题目链接:LeeCode 209长度最小数组
class Solution
{
public:
int minSubArrayLen(int target, vector<int> &nums)
{
int num=0;
int sum=0;
int length=INT_MAX;
int leftp=0;
for(int rightp=0;rightp<nums.size();rightp++){
sum+=nums[rightp];
while(sum>=target){
length=length<(rightp-leftp+1)?length:(rightp-leftp+1);
sum-=nums[leftp++];
}
}
return length==INT_MAX?0:length;
}
};
使用的是双指针法,来做一个区域,通过这一个区域里面的数的和来判别,专业一点叫做滑动窗口。一开始自己并没有任何想法,只想着暴力,看了解析之后明悟了,原来有这么通透的思路。
题目链接
class Solution
{
public:
vector<int> sortedSquares(vector<int> &nums)
{
vector<int> arrayResult(nums.size(),0);
int rightp=nums.size()-1,leftp=0;
for (int i = nums.size()-1; i >= 0; i--)
{
if(nums[leftp]*nums[leftp]>nums[rightp]*nums[rightp]){
arrayResult[i]=nums[leftp]*nums[leftp];
++leftp;
}else{
arrayResult[i]=nums[rightp]*nums[rightp];
--rightp;
}
}
return arrayResult;
}
};
这道题目也是使用双指针法,通过昨天的学习,这个题目一开始就想到了这种解决办法,但是两个指针怎么移动是没想到的。通过这道题目,懂了在这种情况下指针从两边向中间移动,来从大到小找平方,真的很巧妙,我们要创建的数组就从大到小来赋值。
题目链接:59螺旋矩阵
class Solution
{
public:
vector<vector<int>> generateMatrix(int n)
{
vector<vector<int>> res(n,vector<int>(n,0));
int startx=0;
int starty=0;
int area=1;
int loop=n/2;
int count=0;
int i,j;
while(loop--){
for(j=starty;j<n-area;j++){
res[startx][j]=++count;
}
for(i=startx;i<n-area;i++){
res[i][j]=++count;
}
for(;j>starty;j--){
res[i][j]=++count;
}
for(;i>startx;i--){
res[i][starty]=++count;
}
++startx;
++starty;
area+=1;
}
if(n%2==1){
res[n/2][n/2]=++count;
}
return res;
}
};
对于新手的我来说是一种相当新的东西,一个螺旋增加的矩阵,一开始就难倒我了。后面仔细想想后感觉可以做,但是就好像在门外突然忘记钥匙在哪一样,就是差一点找到这个关键的思想。看了解析,突然明悟了。可以用 i , j 来控制画出外圈一层,就像写一个口字一样,先不管中间的内容,先从外圈画起,控制各种条件让他一层层向内画,最中间的那一个点只有奇数矩阵要画,偶数的是不用画的。我最初的想法是一笔不间断的画出,一直向内绕。但是后来学到的方法更容易实现,也更好理解。一个个”口“字的嵌套,直到结束,太巧妙了。