主要是利用到双指针,数组中有正负数,需要从大到小排序比较合适,双指针,i,j从数据两侧开始取元素计算,从大到小(从右至左开始放元素)
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums)
{
int k = nums.size()-1;
vector<int> result(nums.size(),0);
for (int i = 0, j = nums.size()-1;i<=j;)
{
if (nums[i]*nums[i] > nums[j]*nums[j])
{
result[k] = nums[i]*nums[i];
i++;
k--;
}
else if(nums[i]*nums[i] <= nums[j]*nums[j])
{
result[k] = nums[j]*nums[j];
j--;
k--;
}
}
return result;
}
};
滑动窗口法,最巧妙的在这里,j代表滑动窗口尾部,遍历原数组。while条件,i++代表滑动窗口头部,不满足条件则舍弃窗口头部元素,从而实现窗口的大小缩放
class Solution
{
public:
int minSubArrayLen(int target, vector<int>& nums)
{
int sum=0;//滑动窗口内数据和
int subl=0;//滑动窗口长度
int result=nums.size()+1;// 所求连续子数组的长度
int i=0;//滑动窗口起始位置
for(int j=0; j<=nums.size()-1;j++)
{
sum += nums[j];// 滑动窗口求和
while (sum >= target)
{
subl=j-i+1;
sum = sum-nums[i];
result = result < subl ? result : subl;//更新result
i++;
}
}
return result == nums.size() + 1 ? 0:result;
}
};
循环不变量原则
class Solution
{
public:
vector<vector<int>> generateMatrix(int n)
{
//初始化一个n*n的矩阵,所有元素初值为0
vector<vector<int>> res(n, vector<int>(n,0));
//定义循环次数
int loop = n/2;
//定义循环起始位置
int startx = 0, starty = 0;
//计算矩阵的中间位置,用于处理奇数阶矩阵
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++;
}
startx++;
starty++;
offset++;
}
if (n%2)
{
res[mid][mid]= count;
}
return res;
}
};
对于很多语法部分记忆不牢靠,一道题至少做三遍以上;今天用了三个小时去解决问题,但掌握仍不牢固,还得继续努力。