(1)暴力法 平方完用sort函数
主要是第二种方法 快慢指针
(2)双指针
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int k = nums.size() - 1;
//用k从尾部开始遍历,因为最大的平方数只能从两端中取
vector<int> dp(nums.size(),0);
for (int i = 0, j = k; i <= j;)
{
if (nums[i] * nums[i] >= nums[j] * nums[j])
//若左边的平方大,就取左边的数做最大位的数,并把i指针向右移动
{
dp[k] = nums[i] * nums[i];
k--;
i++;
}
else
//若右边的平方大,就取右边的数做最大位的数,并把j指针向左移动
{
dp[k] = nums[j] * nums[j];
k--;
j--;
}
}
return dp;
}
};
这题最重要的就是循环体里的算法,很巧妙,建议记住
class Solution
{
public:
int minSubArrayLen(int target, vector<int>& nums)
{
int i=0;
//i是移动区间开始的下标
int sum=0;
int sulb=0;
//移动区间的长度 sulb
int result=INT32_MAX;
//在C++中,INT32_MAX 是一个宏,表示整型的最大值,即 2147483647。将 result 初始化为
//INT32_MAX,是为了后续的return的判断
for(int j=0;j<nums.size();j++)
{
sum +=nums[j];
//当j+到sum>=target时进入循环
while(sum>=target)
{
sulb=(j-i+1);
result=result<sulb?result:sulb;
sum -=nums[i];
//一直减到不满足条件
i++;
}
}
return result==INT32_MAX?0:result;
}
};
这题重要的是区间问题,开闭很重要,可以借鉴二分法的开闭
class Solution {
public:
vector<vector<int>> generateMatrix(int n)
//二维vector数组的声明方式:vector<vector<int>>
{
vector<vector<int>> res(n, vector<int>(n, 0)); // 使用vector定义一个二维数组
int startx=0;int starty=0;
int i,j;int offest=1;int count=1;
//offest是处理的第几个圈
int times=n/2;
int mid=n/2;
//如果数组是奇数列行,则3/2=1,中间的res[1][1]需要特事特办
while(times--)
{
i=startx;j=starty;
for(;j<n-offest;j++)
{
res[i][j]=count++;
}
for(;i<n-offest;i++)
{
res[i][j]=count++;
}
for(;j>starty;j--)
{
res[i][j]=count++;
}
for(;i>startx;i--)
{
res[i][j]=count++;
}
startx++;starty++;offest++;
//从上一圈更新到下一圈
}
//n为奇数的特事特办
if(n%2==1)
{
res[mid][mid]=count;
}
return res;
//返回一个二维数组
}
};
这里用代码随想录的图片来解释一下
遍历的顺序依次是[1,2),[2,3), [3.4), [4,5) 特事特办res[1][1]