代码随想录算法训练营第二天 | 数组- 滑动窗口-循环不变量
977有序数组的平方
1.暴力算法(先平方,后排序)的时间复杂度是O(n+logn),没有充分有序性
2.双指针法
- 相向的双指针,利用有序性(从两侧出发找较大值)
- 新数组—辅助空间
- vector的初始化参考
- 关于局部变量result的return,vector的初始化是动态内存分配
vector<int> sortedSquares(vector<int>& nums) {
int k = nums.size()-1;
vector<int> result(nums.size(), 0); //初始化:确定新数组大小,赋初值为0
for (int l=0,r = k; l<=r;) {
if (nums[l] * nums[l] < nums[r] * nums[r])
{
result[k--] = nums[r] * nums[r];
r--;
}
else {
result[k--] = nums[l] * nums[l];
l++;
}
}
return result;
}
209长度最小的子数组(滑动窗口)
- 子数组范围[i,j],i是起始位置,j是终止位置,i必然≤j,j决定循环的终止
int minSubArrayLen(int target, vector<int>& nums) {
int i = 0, j = 0;
int min = 100001;
int sum = 0;
for (int j = 0; j < nums.size(); j++) {
sum += nums[j];
while (sum >= target) {
if (min > j - i + 1)
min = j - i + 1;
sum -= nums[i++];
}
}
if (min == 100001)
return 0;
return min;
}
时间复杂度:虽然有两层循环,i、j两个指针同向遍历了整个数组,O(2n)=O(n)
59螺旋矩阵II(统一的左闭右开区间)
循环不变量:每条边的处理规则要统一
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> matrix(n,vector<int>(n, 0));
int offset = 1;
int startx = 0, starty = 0;
int loop = n / 2;
int i, j;
int count = 1;
//if (n % 2 == 1)
//matrix[n / 2][n / 2] = n * n;
while (loop--) { //n是边长,除以2就是圈数
for (j = startx; j < n - offset; j++) //左闭右开
matrix[starty][j] = count++;
for (i = starty; i < n - offset; i++)
matrix[i][j] = count++;
for (; j > startx; j--)
matrix[i][j] = count++;
for (; i > starty; i--)
matrix[i][j] = count++;
startx++;
starty++;
offset++; //n--;
}
if (n % 2 == 1)
matrix[n / 2][n / 2] = count;
return matrix;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端