[2]-代码随想录算法训练营-day2-数组-part2
代码随想录算法训练营第二天|数组-part2
1.LeetCode 997.有序数组的平方
题目
思路
- 先给原始数组每个数进行平方
- 然后用
sort
函数进行排序刷随想录后想法
- 双指针解法,降低时间复杂度为
O(n)
- 题目“非递减数列”,最大的数平方后在两头
- 双指针选最大,然后选次大
- 随想录重新开辟了一个
result
数组存放有序的数组,增加了空间消耗- 是否存在不用开辟空间的双指针解法?
实现困难
- C++的
vector<int>& nums
vector
用法- 编程过程发现,双指针+开辟新数组的方式确实属于我能想到的最优解
for
循环的判断条件以及递增条件模棱两可- 下标忘记
-1
了- 关于平方的处理
实现代码
- 刷随想录前的代码(暴力),时间复杂度为`O(nlogn)
class Solution { public: vector<int> sortedSquares(vector<int>& nums) { for(int i =0; i<nums.size(); i++){ //平方 nums[i] = nums[i] * nums[i]; } sort(nums.begin(), nums.end()); //递增序列 return nums; } };
- 双指针思想
class Solution { public: vector<int> sortedSquares(vector<int>& nums) { int j = nums.size()-1; int i = 0; vector<int>result(nums.size()); for(int k= nums.size()-1; k >= 0; k--){ if((nums[i]*nums[i]) >= (nums[j]*nums[j])){ result[k] = nums[i]*nums[i]; //最大的放最后面 i++; }else{ result[k] = nums[j]*nums[j]; j--; } } return result; } };
双指针,这里稍稍修改一下Carl哥的代码,这里以K为迭代,便于理解。
学习收获
vector
使用- 双指针思想
2.LeetCode 209 长度最小的子数组
题目
- https://leetcode.cn/problems/minimum-size-subarray-sum/
- 找出
nums
中最短的连续子数组,要求该数组之和大于等于target
。思路
- 先确定一个最短的连续子数组,其和大于等于
target
- 记录其长度
- 后移,再确定一个子数组,以此类推。
- 返回最短位置
刷随想录后想法
- 刷完随想录才知道题目什么意思
- 双指针,滑动窗口思想,就是减少不必要的计算,因此节省了时间算法负责度
实现困难
- 题没读懂,导致理解偏差
实现代码
class Solution { public: int minSubArrayLen(int target, vector<int>& nums) { int start = 0; int result = -1; //初始化距离,999表示无穷大 int sum = 0; for(int end=0; end < nums.size(); end++){ sum += nums[end]; while(sum >= target){ if(sum >= target){ //如果找到了一个sum>=target,后移start,再看子数组是否也 if(result != - 1){ result = min(result, end-start+1); //找最小的更新 sum -= nums[start]; start++; }else{ result = end-start+1; } } } } if(result == -1){ return 0; } return result; } };
学习收获
- 审题认真,仔细分析
- 双指针思想
3.LeetCode 59 螺旋矩阵II
题目
思路
刷随想录前解题思路
以行列变换为基础,填充
随想录解题
以圈数为基础,循环不变量如图
刷随想录后想法
- 循环不变量思想
实现困难
- 圈数确定
- 边界值处理
- LeetCode提交报错:下标越界等等
- 实现代码
- 代码暂未实现,报错越界,暂不知原因
class Solution { public: vector<vector<int>> generateMatrix(int n) { // vector< vector<int> >matrix(n, vector<int>(n)); //n*n vector<vector<int>> matrix(n, vector<int>(n)); int startRow,startColumn = 0; int count = 1; int round = 1; int row, column = 0; while(round <= (n/2) ){ //n/2圈 for(column = startColumn; column < n-round; column++){ matrix[startRow][column] = count; count++; } for(row = startRow; row < n-round; row++){ matrix[row][column] = count; count++; } for(column; column > round-1; column--){ matrix[row][column] = count; count++; } for(row; row > round-1; row--){ matrix[row][column] = count; count++; } //对角线,内缩一圈 startColumn++; startRow++; round++; } if(n%2 != 0){ matrix[startRow][startColumn] = count; } return matrix; } };
- 学习收获
- 循环不变量思想
本文来自博客园,作者:缪白(Miubai),转载请注明原文链接:https://www.cnblogs.com/Miubai-blog/p/17666209.html
分类:
算法 / 代码随想录
标签:
代码随想录
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端