刷力扣,对于vector数组的声明定义,要学习一下。
一维数组
vector<int>nums;//不指定长度
vector<int>nums(n); // 指定长度为n
二维数组
创建m*n的二维vector:
vector<vector <int> >nums(m ,vector<int>(n)); //m*n的二维vector
977有序数组的平方
一开始暴力解法,先赋值,再冒泡排序,超时。
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
for(int i=0;i<nums.size();i++){
nums[i]=nums[i]*nums[i];
}
for(int i=0;i<nums.size();i++)
{
for(int j=i+1;j<nums.size();j++)
{
int k;
if(nums[i]>nums[j])
{
k=nums[i];
nums[i]=nums[j];
nums[j]=k;
}
}
}
return nums;
}
};
因此换一个思路。因为数据升序,俩边的数据平方会很大,中间数据最小。因此俩头归并,双指针算法。申请一个新数组放排好的元素。
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int n=nums.size();
vector<int> res(n);
int k=n-1;
for(int i=0,j=n-1;i<=j;)//注意此时i<=j
{
if(nums[i]*nums[i]>=nums[j]*nums[j])//等号切记
{
res[k]=nums[i]*nums[i];
k--;
i++;
}
else
{
res[k]=nums[j]*nums[j];
k--;
j--;
}
}
return res;
}
};
59螺旋矩阵||
经典题型,注意起始点,四个方向的偏移量使用,以及边界点判定。
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
int dx[4]={0,1,0,-1};//
int dy[4]={1,0,-1,0};
vector<vector<int>> matrix(n,vector<int>(n));
int x=0,y=0,d=0;
for(int i=1;i<=n*n;i++)
{
matrix[x][y]=i;
int a=x+dx[d];//注意a,b是下一步坐标,合法了赋值给x,y
int b=y+dy[d];
if(a<0||a>=n||b<0||b>=n||matrix[a][b])//等于n也不行
{
d=(d+1)%4;//取模别忘了加1
a=x+dx[d];
b=y+dy[d];
}
x=a;
y=b;
}
return matrix;
}
};
209长度最小的子数组听了carl哥的课才有思路。思路可以理解,但是实现细节感觉比较吃力。调试了好久才明白。
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int sum=0;
int i=0,res=INT_MAX;
for(int j=0;j<nums.size();j++)//j是终止边界
{
sum=sum+nums[j];
while(sum-nums[i]>=target)//滑动窗口改变起始边界的精髓,削减冗余
{
sum=sum-nums[i];
i++;
}
//cout<<i<<" "<<j<<endl;
if(sum>=target)res=min(res,j-i+1);//要有if,满足>=target的条件。经过测试,判断条件是防止刚开始sum太小,但是改变了res,后面就一直是最小的res
//cout<<res<<endl;
}
if(res==INT_MAX) return 0;
else return res;
}
};