977.有序数组的平方
题目:977.有序数组的平方
视频:代码随想录视频讲解
两种方法:
1.直接排序
2.双指针
vector 中的快捷用法:
1.sort( nums.begin() , nums.end() )可直接排序
2.nums.size()为数组长度
直接排序
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
for(int i=0;i<nums.size();i++)
{
nums[i]*=nums[i];
}
sort(nums.begin(),nums.end());
return nums;
}
};
双指针
因为是有序排列,则平方后最大项只可能在两侧,不可能在中间。两边大,中间小
所以只需比较两侧平方的大小,大的则赋给新数组。题目
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
vector<int> ans(nums.size());
int k=nums.size()-1,i=0,j=nums.size()-1;
while(i<=j)
{
if(nums[i]*nums[i]<nums[j]*nums[j])
{
ans[k]=nums[j]*nums[j];
j--;
}
else
{
ans[k]=nums[i]*nums[i];
i++;
}
k--;
}
return ans;
}
};
209.长度最小的子数组
视频:代码随想录讲解视频
方法:滑动窗口
j指的是终止位置,首先j向后移动,直到总和大于等于目标值,i接着向后移动,看看至少几个数相加就可以大于等于目标值,接着j接着往后走,找到最短的,用min( , )比较一下。
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int i=0,result=nums.size()+100,sum=0;
for(int j=0;j<nums.size();j++)
{
sum+=nums[j];
while(sum>=target)
{
int sublength=j-i+1;
result=min(sublength,result);
sum-=nums[i];
i++;
}
}
if(result==nums.size()+100)
return 0;
else
return result;
}
};
59.螺旋矩阵II
题目:59.螺旋矩阵2
视频:代码随想录视频讲解
循环的是一圈,四条边。
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
int t = 0; // top
int b = n-1; // bottom
int l = 0; // left
int r = n-1; // right
vector<vector<int>> ans(n,vector<int>(n));
int k=1;
while(k<=n*n){
for(int i=l;i<=r;++i,++k) ans[t][i] = k;
++t;
for(int i=t;i<=b;++i,++k) ans[i][r] = k;
--r;
for(int i=r;i>=l;--i,++k) ans[b][i] = k;
--b;
for(int i=b;i>=t;--i,++k) ans[i][l] = k;
++l;
}
return ans;
}
};
总结:
1.vector的一些快捷公式。
2.双指针的思路。
3.滑动窗口太妙了。