提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、有序数组的平方
- 暴力解法,直接求平方,在排序
- 使用双指针,一个指针指向头部,一个指向尾部,对比平方大小,插入到新建数组中
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
//有序数组的平方,时间复杂度为on
//不用暴力解法,先找到最小的,从中间找
//双指针,一个在前,一个在后
vector<int>ans;
int front = 0;
int end = nums.size() - 1;
while (front <= end) {
if (nums[front] * nums[front] > nums[end] * nums[end]) {
ans.push_back(nums[front] * nums[front]);
front++;
}
else {
ans.push_back(nums[end] * nums[end]);
end--;
}
}
vector<int>res;
for (int i = ans.size() - 1; i >= 0; i--) {
res.push_back(ans[i]);
}
return res;
}
};
二、长度最小的子数组
- 暴力解法,但是超出时间限制
- 滑动窗口(另一种方式的双指针),首先确定终止位置,使得保持前几项和大于target,接着不断减小窗口的大小,也就是起始位置不断向后移动,如果不大于target,则终止位置继续向后移动,知道末尾,找出最小的窗口值
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
//暴力解法超出时间限制
//还是用双指针,滑动窗口
//只用一个循环,起始位置和终止位置,只有当出现满足条件之后,起始位置不断移动,也就是缩小范围
int len = INT_MAX;
int sum = 0;
int j = 0;
for (int i = 0; i < nums.size(); i++) {
sum += nums[i];
while (sum >= target) {
len = len < (i - j + 1) ? len : (i - j + 1);
sum -= nums[j++];
}
}
return len == INT_MAX ? 0 : len;
}
};
三、螺旋矩阵Ⅱ
- 三刷,时间有点久远,只记得大概思路
- 模拟流程,注意边界问题,每个模拟过程都要保持一致
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
//模拟过程
vector<vector<int>>ans(n,vector<int>(n,0));
int startx = 0;
int starty = 0;
int loop = n/2;
int offset = 1;
int mid = n/2;
int i, j;
int num = 1;
while (loop--) {
i = startx;
j = starty;
//左闭右开原则
for (j = starty; j < n - offset; j++) {
ans[startx][j] = num++;
}
for (i = startx; i < n - offset; i++) {
ans[i][j] = num++;
}
for (; j > starty; j--) {
ans[i][j] = num++;
}
for(; i > startx; i--) {
ans[i][j] = num++;
}
startx++;
starty++;
offset++;
}
if (n % 2) {
ans[mid][mid] = num;
}
return ans;
}
};
总结
数组方面算法还需努力,着重掌握双指针,滑动窗口问题。加油!
学习资料为《代码随想录》。