- 博客(31)
- 收藏
- 关注
原创 Leetcode 74 搜索二维矩阵
说白了就是把二维数组铺平成一维数组,只不过没有真正进行,而是模拟了一下。初始化时low是数组开始,high是数组结尾。二分查找的策略a[x][y]对应一维数组中的x*列数+y。给你一个满足下述两条属性的。
2024-06-18 16:09:25
237
原创 Leetcode 239 滑动窗口最大值
按照这个逻辑,队首元素应该是最大值,但是队首元素不一定位于当前的滑动窗口下,因而需要检查,如果不在则踢掉,直到在为止。的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的。滑动窗口的位置 最大值。滑动窗口每次只向右移动一位。
2024-06-18 11:22:48
254
原创 Leetcode 300 最长递增子序列
这道题很自然,可以想到dp[i]可以是以[0,i-1]区间内的最大dp 在其结尾加上nums[i]得到,前提条件是nums[i]要大于nums[j]。*max_element(dp.begin(),dp.end()),查找范围内最大的元素。是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。最长递增子序列是 [2,3,7,101],因此长度为 4。,找到其中最长严格递增子序列的长度。
2024-06-18 10:25:07
308
原创 Leetcode 3 无重复字符的最长字串
滑动窗口法,使用一个哈希集合unordered_set,来记录目前子串里存在的字符,当右指针要向右移动时,判断新的字符是否已经存在于哈希集合中,不存在即可加入,并且继续右移(在rk<n-1)时。,请你找出其中不含有重复字符的。请注意,你的答案必须是。因为无重复字符的最长子串是。因为无重复字符的最长子串是。因为无重复字符的最长子串是。,所以其长度为 3。,所以其长度为 1。,所以其长度为 3。
2024-06-18 10:07:16
260
原创 Leetcode 322 零钱兑换
dp[i],可以由零钱的面值得到。如果是1,2,5的,那么则为min[dp[i-1],dp[i-2],dp[i-5]]+1。如果没有任何一种硬币组合能组成总金额,返回。遍历coin时,加入if一句减少多余的计算。,表示不同面额的硬币;你可以认为每种硬币的数量是无限的。计算并返回可以凑成总金额所需的。
2024-06-13 10:32:01
190
原创 Leetcode 198 打家劫舍
dp方程,针对第i个房屋,有两种操作,第一种是偷,则不能偷i-1的房屋,所以为i-2和nums[i]的综合。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。偷窃到的最高金额 = 2 + 9 + 1 = 12。偷窃到的最高金额 = 1 + 3 = 4。
2024-06-13 10:21:08
256
原创 Leetcode 70 爬楼梯
这一层可以是前两层多爬两层,或前一层多爬一层得到,转移方程很容易得到。你有多少种不同的方法可以爬到楼顶呢?1. 1 阶 + 1 阶 + 1 阶。有两种方法可以爬到楼顶。1. 1 阶 + 1 阶。有三种方法可以爬到楼顶。2. 1 阶 + 2 阶。3. 2 阶 + 1 阶。
2024-06-13 10:10:41
179
1
原创 Leetcode 24 两两交换链表中的节点
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。迭代方法,标记好三个节点,弄清楚顺序就好。
2024-06-12 17:04:20
262
原创 Leetcode 19 删除链表倒数第N个结点
非常经典的快慢指针,快指针先走n步,然后快慢同时走,快到结尾说明n的下一个就可以删了。给你一个链表,删除链表的倒数第。个结点,并且返回链表的头结点。你能尝试使用一趟扫描实现吗?
2024-06-12 13:38:22
238
原创 Leetcode 142 环形链表Ⅱ
进一步得到a=(n-1)(b+c)+c,这意味着此时在链表头节点和相遇节点如果都放置一个每次移动一个节点的指针,则会在入环位置相遇。通过绘图可列出等式,假设环外部分长为a,快慢指针相遇时,在环内走的部分为b,剩余环长为c,则有a+n(b+c)+b=2(a+b)该题比之前的区别在于,如果有环,则要求返回第一个入环的节点。如果链表中有某个节点,可以通过连续跟踪。链表中有一个环,其尾部连接到第二个节点。链表中有一个环,其尾部连接到第一个节点。,返回链表开始入环的第一个节点。,则在该链表中没有环。
2024-06-12 11:24:15
326
原创 Leetcode 141 环形链表
count适用于快速存在性检查,返回 0 或 1,代码简洁。.find适用于需要进一步操作的情况,返回元素的迭代器。
2024-06-12 11:07:42
753
原创 Leetcode 贪心算法 45,55 跳跃游戏
无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。我们只维护可以跳到范围内的cover。看到答案就会比较显然,自己想会有一定难度。数组中的每个元素代表你在该位置可以跳跃的最大长度。从下标为 0 跳到下标为 1 的位置,跳。判断你是否能够到达最后一个下标,如果可以,返回。向前跳转的最大长度。跳到最后一个位置的最小跳跃数是。步到达数组的最后一个位置。
2024-06-11 16:00:49
170
原创 Leetcode 114 二叉树展开为链表
用前序遍历的函数,将前序遍历的结果存入vec<treenode*>中,再遍历这个vec建立链表。其中,vec.at(i)方法和vec[i]的区别。额外空间)展开这棵树吗?你可以使用原地算法(
2024-06-11 14:40:49
973
原创 Leetcode 199 二叉树的右视图
此题是层序遍历的应用,在每一层到最后一个,即是该层中最右边的一个节点,加入到vector即可,这么想这道题就会很简单且很自然。,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
2024-06-11 14:08:31
211
1
原创 Leetcode 98 验证二叉搜索树
这启示我们设计一个递归函数 helper(root, lower, upper) 来递归判断,函数表示考虑以 root 为根的子树,判断子树中所有节点的值是否都在 (l,r)(l,r)(l,r) 的范围内(注意是开区间)。那么根据二叉搜索树的性质,在递归调用左子树时,我们需要把上界 upper 改为 root.val,即调用 helper(root.left, lower, root.val),因为左子树里所有节点的值均小于它的根节点的值。若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值;
2024-06-11 11:31:47
446
原创 Leetcode 108 将有序数组转换为二叉搜索树
对于树中的每个节点,其左子树中的所有节点的值都小于该节点的值,而右子树中的所有节点的值都大于该节点的值。这意味着对于任意节点,其左子树中的节点都比它小,右子树中的节点都比它大,因此可以方便地进行查找操作。总的来说,二叉搜索树是一种简单而强大的数据结构,它提供了高效的查找、插入和删除操作,同时能够保持数据的有序性,这使得它在实际应用中被广泛采用。对BST进行中序遍历可以得到一个有序的序列,因为中序遍历的顺序是左子树 -> 根节点 -> 右子树,对于BST来说,这就是从小到大的顺序。排列,请你将其转换为一棵。
2024-06-11 11:04:13
827
原创 Leetcode 102 层序遍历
精髓在于里面的for循环,每次遍历的次数都是当时queue.size()的大小。因为是一层一层添加节点进队的,所以每次遍历的次数就是队列的大小。在每次for循环结束后,添加vec到res中,按层分割。(即逐层地,从左到右访问所有节点)。
2024-06-06 12:37:40
194
原创 Leetcode 101 对称二叉树
目前只能比较好的理解迭代的方法。迭代方法的思想是利用一个队列,把需要比较的Treenode同时依次放入队列,然后每次提取两个节点进行比较即可。你可以运用递归和迭代两种方法解决这个问题吗?给你一个二叉树的根节点。, 检查它是否轴对称。
2024-06-06 10:07:08
260
原创 Leetcode 155最小栈
对于栈来说,如果一个元素 a 在入栈时,栈里有其它的元素 b, c, d,那么无论这个栈在之后经历了什么操作,只要 a 在栈中,b, c, d 就一定在栈中,因为在 a 被弹出之前,b, c, d 不会被弹出。那么,我们可以在每个元素 a 入栈时把当前栈的最小值 m 存储起来。min_stack中同步存储的是栈中每个元素对应的最小值。因此,在操作过程中的任意一个时刻,只要栈顶的元素是 a,那么我们就可以确定栈里面现在的元素一定是 a, b, c, d。--> 返回 -3.--> 返回 -2.
2024-06-05 17:32:08
232
原创 Leetcode 2 链表相加
这个题的思路比较自然,有一个点是两个链表的长度可能不一致,我们采取的方法是发现两个链表当有一个为空时,对那个值取0,因而整体的循环体内的操作是一致的。int n1=l1?l1->val:0;语句,很简洁的说明在l1不为空时则赋值,为空时则赋0。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。carry表示的是向下一位的进位,sum表示的是该位和。的链表,表示两个非负的整数。它们每位数字都是按照。请你将两个数相加,并以相同形式返回一个表示和的链表。的方式存储的,并且每个节点只能存储。
2024-06-05 16:25:25
159
原创 Leetcode 279 完全平方数
这道题可以用动态规划来解决。针对每一个f[n],都可能被拆分为j*j+f[n-j*j],因而我们可以遍历j从1-根号n的区间,找到对每一个n的最小完全平方数。在执行完每次j的遍历后,要加上j*j这一个完全平方数,即f[i] = minn +1。是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。最后返回f[n] 即为题目要求的答案。的完全平方数的最少数量。
2024-06-05 13:51:53
179
原创 Leetcode 二分查找
最后返回的left,就是根据if的判断条件,left左边的值一直保持小于target,right右边的值一直保持大于等于target,而且left最终一定等于right+1,这么一来,循环结束后,在left和right之间画一条竖线,恰好可以把数组分为两部分:left左边的部分和right右边的部分,而且left左边的部分全部小于target,并以right结尾;right右边的部分全部大于等于target,并以left为首。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为。
2024-06-05 13:35:23
242
原创 Leetcode 347 前K个高频元素
Container是实现底层堆的容器,必须是数组实现的容器,如vector、deque。此时默认的容器是vector,默认的比较方式是大顶堆。Functional是比较方式/比较函数/优先级。还没好好学习堆的基础,这里就用上了,后面补。通过本题,学习了一种新的数据结构:堆。,请你返回其中出现频率前。你所设计算法的时间复杂度。Type是要存放的数据类型。
2024-06-05 10:32:20
152
原创 Leetcode 234 回文链表
本人思路,由于链表从后往前遍历较难,而数组比较回文十分简单,所以考虑把链表存储到数组中,然后进行回文比较。但是空间复杂度为O(n).给你一个单链表的头节点。,请你判断该链表是否为。空间复杂度解决此题?
2024-06-04 13:35:25
189
原创 Leetcode 73 矩阵置零
于是,我们使用额外的数组row表示行,col表示列。当matrix[i][j]为0时,将row[i]和col[j]都置为true,更新完后,对matrix进行遍历,当row[i]或col[j]有一个为0时,则置0。有别的方法可以减少空间复杂度,使用matrix的第一行列记录前要先用两个常量来表达col[0]和row[0],不做赘述。本题的精髓在于使用标记数组,来表达某个位置上是否有行或列被置零。只要有一个满足,则该位置的元素为0.,则将其所在行和列的所有元素都设为。的矩阵,如果一个元素为。
2024-06-04 10:41:58
318
原创 Leetcode 56 合并区间
首先对intervals数组进行排序,排序规则是左区间临界值从小到大,这样可以使得问题简化为判断result数组最后的右区间和intervals[i]数组左区间,如果小于则不需要合并,直接加入result;如果大于等于,说明区间存在重叠,需要合并。区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。区间 [1,4] 和 [4,5] 可被视为重叠区间。表示若干个区间的集合,其中单个区间为。请你合并所有重叠的区间,并返回。
2024-06-04 09:53:14
190
原创 Leetcode 238 除自身以外数组的乘积
解法,左右乘积列表。L[i]表示的是该值左边元素的乘积和,R[i]表示的是该值右边元素的乘积和。L[i] * R[i] 即为所求answer[i]之中任意元素的全部前缀元素和后缀的乘积都在。时间复杂度内完成此题。之外其余各元素的乘积。
2024-06-03 15:00:13
155
1
原创 LeetCode 53 最大子数组和
max_element可以找到dp数组中最大值的迭代器。获取其指向元素的值。但是额外开辟数组占据了O(n)的空间复杂度。使用临时变量pre来存储dp[i]的情况,直接对全局maxAnx进行比较。空间复杂度为O(1)。,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。const auto &x:nums 和 auto &x:nums 的区别。连续子数组 [4,-1,2,1] 的和最大,为 6。使用dp数组,需要n的空间复杂度的方法。是数组中的一个连续部分。
2024-06-03 14:33:23
163
1
原创 LeetCode 189 轮转数组
第一种比较好想,建立新的数组进行操作再拷贝,需要利用额外的空间。第二种根据变化的规律,设计reverse函数,进行三次翻转实现。通过翻转函数reverse三次翻转也可以实现题目的要求,不需要额外的空间。assign方法,拷贝Newarray的元素到nums中,参数是被拷贝数组的起始和结尾。Newarray[(i+k)%n] = nums[i] 指的是对应元素进行的变换操作。向右轮转 1 步: [99,-1,-100,3]向右轮转 2 步: [3,99,-1,-100],将数组中的元素向右轮转。
2024-06-03 13:57:41
208
原创 LeetCode 560 和为K的子数组
记录一下LeetCode 刷题的心路历程,以增加自己的记忆与理解。本人C++小白,大佬勿喷。如果对文内内容可以提出建议或帮助,感激不尽。降低复杂度实现的方法:利用前缀表避免反复计算连续数组和,而unordered_map 对键的查找时间复杂度为O(1)枚举方法不作赘述,这里提供一种前缀和和unordered_map的实现,可以有效降低复杂度为O(n)子数组是数组中元素的连续非空序列。560. 给你一个整数数组。
2024-06-03 11:02:25
427
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人