代码随想录算法训练营第二天| 977.有序数组的平方,209.长度最小的子数列,59.螺旋矩阵Ⅱ
1.代码随想录算法训练营第二天| 977.有序数组的平方,209.长度最小的子数列,59.螺旋矩阵Ⅱ
2.代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素3.代码随想录算法训练营第三天| 203.移除链表元素 707.设计链表 206.反转链表4.代码随想录算法训练营第四天| 24. 两两交换链表中的节点, 19.删除链表的倒数第N个结点,面试题02.07.链表相交,142.环形链表Ⅱ5.代码随想录算法训练营第六天| 242.有效的字母异位词,349.两个数组的交集,202.快乐数,1.两数之和6.代码随想录算法训练营第7天| ● 454.四数相加II ● 383. 赎金信 ● 15. 三数之和 ● 18. 四数之和7.代码随想录算法训练营第8天| ● 344.反转字符串 ● 541. 反转字符串II ● 剑指Offer 05.替换空格 ● 151.翻转字符串里的单词 ● 剑指Offer58-II.左旋转字符串8.代码随想录算法训练营第9天| ●28. 实现 strStr() ●459.重复的子字符串 ●字符串总结 ●双指针回顾 9.代码随想录算法训练营第10天| 232.用栈实现队列 ● 225. 用队列实现栈10.代码随想录算法训练营day13| ● 239. 滑动窗口最大值 ● 347.前 K 个高频元素 ● 总结11.代码随想录算法训练营day11| ● 20. 有效的括号 ● 1047. 删除字符串中的所有相邻重复项 ● 150. 逆波兰表达式求值12.代码随想录算法训练营day14| ● 二叉树理论基础 ● 递归遍历 ● 迭代遍历 ● 统一迭代13.代码随想录算法训练营day15 | ● 层序遍历 10 ● 226.翻转二叉树 ● 101.对称二叉树 2 14.代码随想录算法训练营day16 | ● 104.二叉树的最大深度 559.n叉树的最大深度 ● 111.二叉树的最小深度 ● 222.完全二叉树的节点个数15.代码随想录算法训练营day17 | ● 110.平衡二叉树 ● 257. 二叉树的所有路径 ● 404.左叶子之和 16.代码随想录day21 | ● 530.二叉搜索树的最小绝对差 ● 501.二叉搜索树中的众数 ● 236. 二叉树的最近公共祖先 977.有序数组的平方
双指针法
因为负数平方后也会变大,所以较大的平方值只可能在靠近两端的位置,越往中间走平方值必定越小。
所以,在原数组两端各定义一个指针,慢慢往中间走,然后把平方值按顺序放到新数组里即可。
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int len = nums.size();
int i = 0, j = len - 1, k = len - 1;
vector<int> result(len, 0);
while(i <= j)
{
if(nums[i]*nums[i] < nums[j]*nums[j])
{
result[k] = nums[j]*nums[j];
k--;
j--;
}
else
{
result[k] = nums[i]*nums[i];
k--;
i++;
}
}
return result;
}
};
209.长度最小的子数组
mydemo
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int len = nums.size();
int sum = 0;
for(int i=0; i<len-1; i++)
for(int j=0; j<len-1-i; j++)
if(nums[j] < nums[j+1])
{
int tmp = nums[j+1];
nums[j+1] = nums[j];
nums[j] = tmp;
}
for(int i=0;i<len;i++)
cout << nums[i] <<" ";
for(int i=0;i<len;i++)
{
sum += nums[i];
if(sum >= target)
return i+1;
}
return 0;
}
};
这个案例没通过:
[12,28,83,4,25,26,25,2,25,25,25,12]
我的输出:7
预期输出:8
错误原因:
找出该数组中满足其总和大于等于
target
的长度最小的 连续子数组[numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度。
我这个算法只考虑了最短,没考虑到还需要在原数组中连续
- 滑动窗口法
本质也是双指针,但是这里更巧妙,是动态的双指针。
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int sum = 0;
int subl = 0;
int result = INT32_MAX;
int len = nums.size();
int i = 0;
for(int j=0; j<len; j++)
{
sum += nums[j];
while(sum >= target)
{
subl = j-i+1;
result = result < subl? result : subl;
sum -= nums[i];
i++;
}
}
return result == INT32_MAX? 0 : result;
}
};
- 暴力搜索区间法
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int subl = 0;
int result = INT32_MAX;
int len = nums.size();
for(int j=0; j<len; j++)
{
int sum = 0;
for(int i=j; i<len ;i++)
{
sum += nums[i];
if(sum >= target)
{
subl = i-j+1;
result = result < subl? result : subl;
break;
}
}
}
return result == INT32_MAX? 0 : result;
}
};
59. 螺旋矩阵Ⅱ
模拟题,锻炼代码能力。注意边界条件,注意循环不变量。
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n, vector<int>(n, 0));
int count = 1;
int offset = 1;
int startx = 0;
int starty = 0;
int loop = n/2;
int mid = n/2;
int i,j;
while(loop--)
{
i = starty;
j = startx;
for( ; j<n-offset; j++)
res[i][j] = count++;
for(; i<n-offset; i++)
res[i][j] = count++;
for(; j>offset-1; j--)
res[i][j] = count++;
for(; i>offset-1; i--)
res[i][j] = count++;
offset++;
startx++;
starty++;
}
if(n%2 == 1)
res[mid][mid] = count;
return res;
}
};
合集:
代码随想录
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!