- 博客(10)
- 收藏
- 关注
原创 代码随想录算法训练营day11 | 150.逆波兰表达式求值、239.滑动窗口最大值
对于窗口里的元素{2, 3, 5, 1 ,4},单调队列里只维护{5, 4} 就够了,保持单调队列里单调递减,此时队列出口元素就是窗口里最大元素。保持如上规则,每次窗口移动的时候,只要问que.front()就可以返回当前窗口的最大值。该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6。的滑动窗口从数组的最左侧移动到数组的最右侧。该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9。返回一个表示表达式值的整数。来看一下单调队列如何维护队列里的元素。
2025-02-09 15:44:53
1565
原创 代码随想录算法训练营day10 | 232.用栈实现队列、225.用队列实现栈、20.有效的括号、1047.删除字符串中的所有相邻重复项
例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。思路:和上题不一样,上一题需要一个出栈一个入栈来模仿队列;请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(在完成所有重复项删除操作后返回最终的字符串。上反复执行重复项删除操作,直到无法继续删除。思路:用栈来实现的一道经典题目。,判断字符串是否有效。
2025-02-08 15:08:42
630
原创 代码随想录算法训练营day9 | 151.翻转字符串里的单词、卡码网:55.右旋转字符串
字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。第二行为字符串 s,代表需要旋转的字符串。如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。思路:先反转整个字符串,再分别反转前k个字符和剩下的字符就可以了。反转后的字符串中不能存在前导空格和尾随空格。
2025-02-07 15:42:24
493
原创 代码随想录算法训练营day8 | 344.反转字符串、541.反转字符串Ⅱ、卡玛网.54.替换数字
思路:如果不能添加新的辅助空间,就在原数组上进行操作就有点复杂。首先要扩展原数组到规定的大小,然后要从后往前将数字变为“number”。思路:可以用库函数reverse,但是用这个就太简单了,所以最好不用库函数,就在数组上面进行操作。思路:这个题目就可以用reverse这个库函数来做,因为重点不在反转,而是在制定的一些规则上进行反转。从前向后填充就是O(n^2)的算法了,因为每次添加元素都要将添加元素之后的所有元素整体向后移动。编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组。
2025-02-05 16:12:32
314
原创 代码随想录算法训练营day7 | 454.两数相加Ⅱ、383.赎金信、15.三数之和、18.四数之和
四数之和的双指针解法是两层for循环nums[k] + nums[i]为确定值,依然是循环内有left和right下标作为双指针,找出nums[k] + nums[i] + nums[left] + nums[right] == target的情况,三数之和的时间复杂度是O(n^2),四数之和的时间复杂度是O(n^3)。上题的双指针解法是一层for循环num[i]为确定值,然后循环内有left和right下标作为双指针,找到nums[i] + nums[left] + nums[right] == 0。
2025-02-03 15:26:26
1547
原创 代码随想录算法训练营day6 | 242.有效的字母异位词、349.两个数组的交集、202.快乐数、1.两数之和
所以此处采用unordered_set这种数据结构(可以去重)来存储nums1,再在nums1中一个个的去找nums2的元素,如果找到了就保存到result中(一个自己定义的哈希表)最后输出result即可。思路:最基本的先写出对这个数的每一位求平方和的函数,这个就不赘述了。本题呢,我就需要一个集合来存放我们遍历过的元素,然后在遍历数组的时候去询问这个集合,某元素是否遍历过,也就是 是否出现在这个集合。最后再遍历一次另一个字符串,对相应的数组的值减一,如果最后数组所有值为0,则说明是异位词。
2025-02-02 14:38:49
1412
原创 代码随想录第一天|704.二分查找、27.移除元素、977.有序数组的平方
力扣题目链接、文章讲解/视频讲解给定一个 个元素有序的(升序)整型数组 和一个目标值 ,写一个函数搜索 中的 ,如果目标值存在返回下标,否则返回 。示例 1:输入: 输出: 4示例 2:输入: 输出: -1思路:两种写法:左闭右闭和左闭右开。先说第一种,我们定义 target 是在一个在左闭右闭的区间里,也就是[left, right] 。区间的定义这就决定了二分法的代码应该如何写,因为定义target在[left, right]区间,所以有如下两点:代码如下:左闭右开可
2025-01-26 16:29:55
551
原创 代码随想录算法训练营第四天|24.两两交换链表中的节点、19.删除链表中的倒数第N个节点、面试题02.07.链表相交、142。环形链表Ⅱ
这就要使用双指针,定义两个指针fast和slow都指向head头结点,让fast先走N步,之后fast和slow同步走,直到fast指向NULL,这时候slow就指向被删除的那个节点,但我们需要一个指针指向被删除的前一个,于是让fast先走N+1步即可。给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。思路:先算出两个链表的长度,将两者尾部对齐,从对齐的节点开始比较,如果相等,输出那个节点,如果不等说明两链表不相交。
2025-01-26 15:04:51
442
原创 代码随想录算法训练营第三天| 203.移除链表元素、206.反转链表、707.设计链表
思路:要用到双指针,定义一个current指向头结点,定义一个pre指向NULL,同时定义一个临时变量temp指向current->next,后令current->next = pre,反转完后,pre和current同时前移一位,即pre = current,current = temp。思路:感觉没什么值得注意的点,最多就是设置一个临时变量temp来储存要删除的点,然后注意要将整个链表遍历完防止出现遗漏。注意遍历条件,当current指向NULL时,遍历停止,整个链表已经反转。
2025-01-24 16:44:18
312
原创 代码随想录第二天| 209.长度最小的子数组、59.螺旋矩阵Ⅱ
旋转圈数很好判断,如果给出的n是偶数,那么n/2就是旋转的圈数;如果n是奇数,那么矩阵最中间的那个数字也就是matrix[n/2][n/2] = n^2(最好单独写一段代码为这个空赋值,因为不好再单独进行边界判断)定义两个变量i,j,j指向的是终点位置,但一开始是和i一同指向数组最开始的位置;i是起始位置但是是动态变化的。j不断往后移动,在满足数组总和大于target的情况下不断将i往前移,最后得到的就是长度最小的子数组。思路:本身并不涉及算法,主要是边界的判断以及旋转圈数的判断。
2025-01-23 17:00:12
319
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅