12 2024 档案

摘要:题目链接 解题思路:在链表上使用排序算法。注意,不能使用快排,因为快排的最差时间复杂度是O(n^2),数组形式的快排,以随机数划分能够得到O(n*logn),但是链表的形式,不太好以随机数的方式划分。所以最好的排序方法是使用归并排序。 先用快慢指针,将链表分成两部分,然后两部分分别归并排序,得到两个 阅读全文
posted @ 2024-12-27 17:15 ouyangxx 阅读(3) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:用链表+哈希表。链表从头串到尾,淘汰时,从尾部开始淘汰。每次get时,如果找到了,则把这个节点移到头部。每次put,新建一个节点,放在头部,如果容量不够了,则淘汰尾部的数据。哈希表的作用是,能快速通过key找到链表中的节点。 代码 class LRUCache: class No 阅读全文
posted @ 2024-12-27 16:35 ouyangxx 阅读(2) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:一个快指针,一个慢指针,如果二者相等了,说明有环。如果快指针为空了,说明没环 代码 # Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # s 阅读全文
posted @ 2024-12-27 15:35 ouyangxx 阅读(2) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:和139题类似,只不过要把所有的结果存起来而已 代码 class Solution: def check(self, s: str, i: int, s2: str) -> int: if i + len(s2) > len(s): return -1 for ch in s2: 阅读全文
posted @ 2024-12-27 15:13 ouyangxx 阅读(2) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:暴力递归+缓存,也就是自顶向下的动态规划。process(s, index, wordDict),s[index..]后面的能被wordDict拼出来吗?使用一个for循环,尝试wordDict中的所有单词。然后加一个缓存表,就可以了 代码 class Solution: # s 阅读全文
posted @ 2024-12-27 14:58 ouyangxx 阅读(10) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:先拷贝新节点,新节点放在老节点后面。然后再遍历一遍,设置新节点的random指针。新节点的random,指向的是「老节点的random的下一个节点」。最后将新老节点分开即可。 代码 class Solution: def copyRandomList(self, head: 'O 阅读全文
posted @ 2024-12-27 14:36 ouyangxx 阅读(2) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:只出现一次,其余的数全部两次,异或操作,其余两次的数异或之后,全部变成了0. 代码 class Solution: def singleNumber(self, nums: List[int]) -> int: return reduce(lambda x, y : x ^ y, 阅读全文
posted @ 2024-12-27 11:27 ouyangxx 阅读(7) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:回溯,尝试每一种可能,process(s, i),划分s[i...],当前的回文子串有哪些情况?单独一个i,或者i, i+1,或者i, i+1, i+2,因此,用一个for循环解决。然后再检查[i, j]是否是回文子串,如果是,则继续递归,划分下一个回文子串process(s, 阅读全文
posted @ 2024-12-27 10:30 ouyangxx 阅读(2) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:通常想法是,把哪些'O'变成'X',这种想法很难做。一个比较简单点是,「哪些'O'不能变成'X'」。其实就是与第一行,最后一行,第一列,最后一列,「相邻的这些」'O',不能变成'X',其他的都能变成' X'. 具体来说,把第一行、最后一行、第一列、最后一列的'O',通过「感染」函 阅读全文
posted @ 2024-12-26 18:29 ouyangxx 阅读(5) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:难点在于时间复杂度O(n),如果直接排序,题目就简单了。但是不需要全部有序,只需要每次从其中拿出一个数,是递增的即可,也就是说,使用优先级队列,堆头是最小值。注:该方法仍然是O(n*logn) 代码 class Solution: def longestConsecutive(s 阅读全文
posted @ 2024-12-26 16:54 ouyangxx 阅读(5) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:双指针,一个一个对比,跳过非数字字母,对比时,忽略大小写 代码 class Solution: def isPalindrome(self, s: str) -> bool: # 双指针 i, j = 0, len(s) - 1 while i < j: # 跳过非字母和数字字符 阅读全文
posted @ 2024-12-26 16:19 ouyangxx 阅读(6) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:二叉树递归套路,以某个节点node为根,最大路径是什么? 1️⃣与node无关,也就是说,不经过node 左子树的最大值,与右子树的最大值,较大的那个,就是结果 2️⃣与node有关 单独node一个节点 经过左子树 经过右子树 左右子树都经过 所以我们需要的信息就两个:tota 阅读全文
posted @ 2024-12-26 16:00 ouyangxx 阅读(8) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:来到i天,如果i的价格大于i-1的价格,那么就可以赚到差价。所以,遍历的过程中,只要prices[i] > prices[i - 1],那么就可以获利了 代码 class Solution: def maxProfit(self, prices: List[int]) -> in 阅读全文
posted @ 2024-12-26 15:12 ouyangxx 阅读(3) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:计算所有,在i卖出,利润最大为多少,求出的所有结果中,最大的那个,就是最终的结果。那么在i卖出,利润最大为多少?就是[0, i - 1]价格最低的时候。 代码 class Solution: def maxProfit(self, prices: List[int]) -> in 阅读全文
posted @ 2024-12-26 15:03 ouyangxx 阅读(5) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:不要被「形状」所迷惑,其实就是,第i行(从0开始),一共有i + 1个数,第一个数和最后一个数是1,其余的数是上一行,「相同位置」+「左边一个位置」。 代码 class Solution: def generate(self, numRows: int) -> List[List 阅读全文
posted @ 2024-12-26 14:45 ouyangxx 阅读(8) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:其实就是在层序遍历的过程中,把next指针填上 代码 class Solution: def connect(self, root: 'Optional[Node]') -> 'Optional[Node]': if root == None: return None # 层序遍 阅读全文
posted @ 2024-12-26 14:39 ouyangxx 阅读(6) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:这里面有一个构造「平衡二叉树」,似乎很难。实际上,我们每次构造时都拿中点划分,就能得到平衡的。 具体来说process(nums, L, R)在nums[L, R]上构造平衡搜索二叉树,我们以中点mid=(R+L)/2是头,然后左节点process(nums, L, mid - 阅读全文
posted @ 2024-12-25 17:50 ouyangxx 阅读(8) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:首先我们得知道人工怎么建这棵树。先序遍历[0, R1]第一个节点,就是根。然后我们在中序遍历[0, R2]找到根的位置,假如是x,那么,中序遍历中[0, x-1]就是左子树,中序遍历中[x+1, R2]就是右子树。那么先序遍历呢?左子树节点个数是x个,先序遍历是要先遍历完左子树, 阅读全文
posted @ 2024-12-25 17:37 ouyangxx 阅读(8) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:做类似的二叉树的题,一定要有宏观的思路,不要陷入局部。例如,要「公平」对待每个节点,每个节点,可以单独看作「以该节点为根」的二叉树。本题目最大深度,我们单独看某一个节点,其实就是,max(左子树的深度,右子树的深度) + 1,那么左子树的深度,和右子树的深度怎么求?直接递归调用即 阅读全文
posted @ 2024-12-25 17:08 ouyangxx 阅读(5) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:和层序遍历有明显的不同。通过观察,可以得到,当前层,和下一层的顺序是「相反」的,遇到这种相反的问题,考虑用栈。本题就是用两个栈,一个栈在放入时,先放左儿子,再放右儿子,另一个栈在放入时,先放右儿子,再放左儿子。然后两个栈交替使用即可。 为什么能得到这个思路?观察得到的 代码 cl 阅读全文
posted @ 2024-12-25 17:00 ouyangxx 阅读(4) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:层序遍历就用队列,唯一需要注意的就是,要每一层单独收集,所以要用一个变量,记录每一层需要收集的数目,同时还要记录下一层需要收集的数目 代码 class Solution: def levelOrder(self, root: Optional[TreeNode]) -> List 阅读全文
posted @ 2024-12-25 16:43 ouyangxx 阅读(11) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:递归的思路,就是左子树和右子树的值相等,同时,左子树的左子树与右子树的右子树要相似,左子树的右子树与右子树的左子树要相似。看代码很清晰 代码 class Solution: def process(self, node1, node2) -> bool: if node1 == 阅读全文
posted @ 2024-12-25 16:25 ouyangxx 阅读(3) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:以某个节点为头,是否是搜索二叉树?其实就是问子树要信息 左子树:最大值,最小值,左子树整体是否是搜索二叉树? 右子树:最大值,最小值,右子树整体是否是搜索二叉树 得到信息后,再处理就行,详细处理看代码 代码 class Solution: class Info: def __in 阅读全文
posted @ 2024-12-25 15:59 ouyangxx 阅读(6) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:中序遍历:左中右,用一个栈,同时用空来标识「中」,所以入栈顺序就是右->中->None->左 代码 class Solution: def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]: # 使用栈 # 阅读全文
posted @ 2024-12-25 15:09 ouyangxx 阅读(8) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:动态规划:从左往右的尝试模型,来到index位置,只解码index一个数,或者解码index和index+1两个数 代码 class Solution: # 只需要解码s[index...]即可 def process(self, s: str, index: int, dp: 阅读全文
posted @ 2024-12-24 16:21 ouyangxx 阅读(22) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:从后往前填数字即可 代码 class Solution: def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None: # 从后往前开始填充 L = m - 1 # nums1[0, L] 阅读全文
posted @ 2024-12-24 15:55 ouyangxx 阅读(5) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:单调栈,以i位置为高度(宽),最长能有多长,其实就是找离i最近的,小于i的位置,其实就是单调栈 代码 class Solution: def largestRectangleArea(self, heights: List[int]) -> int: # 使用单调栈 栈底到栈顶 阅读全文
posted @ 2024-12-24 15:35 ouyangxx 阅读(4) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:简单的回溯,就是两种情况,要这个数,不要这个数 代码 class Solution: # 现在来到index位置,决定nums[index]要,还是不要,ans是最终的结果,path是一条分支的结果 def process(self, nums: List[int], index 阅读全文
posted @ 2024-12-24 11:15 ouyangxx 阅读(2) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:以i开头,最小覆盖子串是什么,然后求出所有的结果,最小的便是。先求出i的结果,是[i, j],然后求i+1时,直接从j后遍历即可。 窗口的思想,窗口在[i, j],然后来到i+1,先把i弹出去,弹出去的前提是,s[i]是我们需要的字符。然后再看[i + 1, j]是否满足,如果不 阅读全文
posted @ 2024-12-24 11:01 ouyangxx 阅读(14) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:快排中的一部分,等于1的放中间,等于0的放左边,等于2的放右边 代码 class Solution: def sortColors(self, nums: List[int]) -> None: left_border = -1 right_border = len(nums) 阅读全文
posted @ 2024-12-24 09:42 ouyangxx 阅读(7) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:如何原地,是困难点。我们可以使用原有的矩阵,来存放某些信息。原来的矩阵第一行,matrix[0][i]如果等于0,代表第i列有0,原来的矩阵第一列,matrix[i][0]如果等于0,代表第i列有0。还有一个注意点,就是matrix[0][0]代表什么?这是一个歧义的点,所以不存 阅读全文
posted @ 2024-12-22 21:07 ouyangxx 阅读(7) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:递推公式就是F(n) = F(n - 2) + F(n - 2) 代码 class Solution: def climbStairs(self, n: int) -> int: # 递推公式就是F(n) = F(n - 1) + F(n - 2) if n == 1: retu 阅读全文
posted @ 2024-12-22 19:58 ouyangxx 阅读(3) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:直接暴力找,但是使用二分法暴力找 代码 class Solution: def mySqrt(self, x: int) -> int: # 二分法暴力找 L = 0 R = x ans = -1 while L <= R : mid = (R + L) // 2 if mid 阅读全文
posted @ 2024-12-22 19:55 ouyangxx 阅读(2) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:从后往前遍历,模拟即可 代码 class Solution: def plusOne(self, digits: List[int]) -> List[int]: # 直接在原数组上改 carry = 1 for i in range(len(digits) - 1, -1, - 阅读全文
posted @ 2024-12-22 19:51 ouyangxx 阅读(3) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:数学题,一共要走m + n - 2步,选择其中的n - 1往右走,或者选择其中的m - 1往下走,就是C(n-1)/(n+m-2) 代码 class Solution: def uniquePaths(self, m: int, n: int) -> int: # 计算C(m - 阅读全文
posted @ 2024-12-22 19:41 ouyangxx 阅读(2) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:按照第一维度排序,然后依次遍历,假设现在遍历到i,[begin1, end1],然后i+1是[begin2, end],如果begin2 <= end1,那么二者可以合并成[begin1, max(end1, end2)],因为按照第一维度排序的,所以开头是begin1,结尾注意 阅读全文
posted @ 2024-12-22 19:33 ouyangxx 阅读(10) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:初始能够到达最远的位置max_index是nums[0],然后我们就依次遍历i <= nums[0],然后途中不断更新max_index,如果更新到某一时刻,到达了最后一个下标,返回true,如果「走不动」了,那么就返回false 代码 class Solution: def c 阅读全文
posted @ 2024-12-22 15:49 ouyangxx 阅读(4) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:宏观思路,一圈一圈打,确定好「一圈」的左上角以及右下角,然后再打印。有两种特殊情况,左上角和右上角的列相等时,只需要打一行即可;左上角的列和右下角的列相等时,只需打印一列即可。 代码: from typing import List class Solution: def spi 阅读全文
posted @ 2024-12-22 15:22 ouyangxx 阅读(10) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:子数组问题,考虑以i结尾,或者以i开头结果怎么样。本题,以i开头结果是如何?从后往前遍历,假设i+1的结果大于0,为x,那么,求i时,结果就是nums[i] + x,如果x小于0,那么结果就是nums[i] 代码 class Solution: def maxSubArray(s 阅读全文
posted @ 2024-12-20 17:16 ouyangxx 阅读(5) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路: 方法一:每个「字母异位词」,排序后的结果,都是一致的,所以,可以用一个map,key就是排序后的字符串,value就是所有的「字母异位词」。 方法二:直接使用map,不需要排序得出来,看下面的代码 class Solution { public: struct MyCompar 阅读全文
posted @ 2024-12-20 16:53 ouyangxx 阅读(12) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:要有宏观的思路,策略是一圈一圈的转换。然后每一圈,又分成一个一个的小组进行转换,见下图 代码 class Solution { public: void rotate(vector<vector<int>>& matrix) { int n = matrix.size(); fo 阅读全文
posted @ 2024-12-20 11:32 ouyangxx 阅读(5) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:采取填数的方式,来到0下标,哪个数放在0下标?一个for循环,[0...]都可以放0下标。0下标填完之后,后续的操作不再处理0下标的,也就是说,哪个数放1下标?一个for循环,[1...]都可以放1下标(注意,不能动0下标的数了)。 代码 class Solution { pub 阅读全文
posted @ 2024-12-20 10:50 ouyangxx 阅读(5) 评论(0) 推荐(0) 编辑
摘要:题目链接 思路和之前一个题类似,链接 代码 class Solution { public: bool process(string &s, string &p, int i, int j, vector<vector<int>> &dp) { if (i == s.length() && j == 阅读全文
posted @ 2024-12-19 11:02 ouyangxx 阅读(8) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:单独算i位置的雨水。i位置雨水是多少?max(0, min(左边最大值,右边最大值) - i的值)。关键就是得到min(左边最大值,右边最大值)。 我们先用一个指针left,指向最左,代表左边的最大值,一个指针right,指向最右,代表右边的最大值。 如果left < right 阅读全文
posted @ 2024-12-19 10:40 ouyangxx 阅读(3) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:整体思路就是,我们先假想,[0, n - 1]上,放满了1~n,所以,我们缺失的第一个正数就是n+1。也就是说,i下标,放的数字是i+1。那么我们从左往右遍历的过程中,就尽量满足这种情况 1️⃣如果nums[i] == i + 1,直接跳过,啥都不管 2️⃣如果nums[i] < 阅读全文
posted @ 2024-12-19 10:24 ouyangxx 阅读(8) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:就是一个递归。弄清楚题目意思,n=1时,就返回1,然后n=2时,返回上一个结果,上一个结果是一个1,所以就是11,然后n=3,返回上一个结果,就是两个1,所以就是21 代码 class Solution { public: string countAndSay(int n) { 阅读全文
posted @ 2024-12-18 17:34 ouyangxx 阅读(3) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:整体思路是一个回溯,一行一行填。然后填的过程中可以剪枝,也就是我们可以添加一些约束条件,不能填的时候,就没必要去尝试了(还有一种填法,全部填完之后,再检查是否合规,这样复杂度太大了)。具体细节看代码。 代码 class Solution { public: // 0~8行,0~8 阅读全文
posted @ 2024-12-18 17:13 ouyangxx 阅读(9) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:整体框架就是二分,只是找到了target后,还要继续查找。分两次查找,第一次是「找到等于target最左的位置」,第二次是「找到等于target最右的位置」 代码 class Solution { public: vector<int> searchRange(vector<in 阅读全文
posted @ 2024-12-18 14:53 ouyangxx 阅读(3) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:题目意思是,把原来的有序数组分成两半,左边的放右边来,右边的放左边去,然后数组中是否存在target这个数,存在则返回其下标。 要求时间复杂度O(logn) 整体的框架还是二分查找,但是在查找过程中,我们总能得到「一边」是有序的,例如在整体[L, R]上,划分成两半是[L, x] 阅读全文
posted @ 2024-12-18 14:33 ouyangxx 阅读(5) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:保证一个有效区,当发现一个「新数」时,就扩大有效区。 怎么判断是否是一个新数?来到一个i位置,往左边看,如果相等,则i++,一直到不想等为止。为什么可以这样?因为是有序的。 代码 class Solution { public: int removeDuplicates(vect 阅读全文
posted @ 2024-12-18 11:27 ouyangxx 阅读(4) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:每次从全局的拿一个最小值出来,每个链表的「头」,都是最小的,所以,我们可以使用一个小根堆(优先级队列),存放每个链表当前的「头」,然后弹出一个全局最小的节点出来,然后把该节点的next放回小根堆,供之后使用。 注意,压入小根堆时,要保证不为nullptr。 代码 /** * De 阅读全文
posted @ 2024-12-18 11:12 ouyangxx 阅读(11) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:从左往右生成,生成的过程中,保证右括号不能比左括号多。 代码 class Solution { public: // 总共有n个括号对,left_res就是左括号还能使用的数目,right_res就是右括号还能使用的数目 // 要保证左括号大于等于右括号数目,即left_res 阅读全文
posted @ 2024-12-18 10:59 ouyangxx 阅读(6) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:括号匹配问题,优先想到栈。 代码 class Solution { public: bool isValid(string s) { stack<char> st; for (auto &ch : s) { // 如果是右括号,那么必须得有一个相匹配的左括号 if (ch == 阅读全文
posted @ 2024-12-18 10:51 ouyangxx 阅读(8) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:可以定义一个node节点,然后一个cur节点,node节点先走n-1步,然后cur和node同时走,如果node->next == null了,那么cur就是被删除的节点,此时,我们用pre节点指向cur的前一个节点(node和cur在走的时候,pre也跟着走),就可以删除cur 阅读全文
posted @ 2024-12-18 10:46 ouyangxx 阅读(10) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:一个简单的回溯题目。 代码 class Solution { public: map<char, string> table{ {'2', "abc"}, {'3', "def"}, {'4', "ghi"}, {'5', "jkl"}, {'6', "mno"}, {'7', 阅读全文
posted @ 2024-12-18 10:39 ouyangxx 阅读(9) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:没啥可说的,按照要求一个个字符处理 代码 class Solution { public: int romanToInt(string s) { int ans = 0; int len = s.length(); map<char, int> table{ {'I', 1}, 阅读全文
posted @ 2024-12-18 09:58 ouyangxx 阅读(3) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:整数转罗马数字,可以理解为一个一个「数」,有一个转换表,从高位依次往低位「数」,直接看代码更清晰 代码 class Solution { public: string intToRoman(int num) { // 转换表 vector<pair<int, string>> t 阅读全文
posted @ 2024-12-18 09:21 ouyangxx 阅读(10) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:用第一个字符串的每个字符,逐个比较其他字符串,注意别越界就行 代码 class Solution { public: string longestCommonPrefix(vector<string>& strs) { string ans = ""; int len = str 阅读全文
posted @ 2024-12-18 08:57 ouyangxx 阅读(3) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:先写一个暴力递归,bool process(s, p, i, j),s[i...]与p[j...]能否匹配成功?,i之前,以及j之前的都已经匹配成功了。 1️⃣p[j + 1] != '*' 若p[j] == '.',则递归调用process(s, p, i + 1, j + 1 阅读全文
posted @ 2024-12-17 17:39 ouyangxx 阅读(5) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:拆分问题,三数之和,我们可以固定一个数字,就变成了两数之和了。还有一个难点就是,如何去重? 1️⃣先排序。 2️⃣固定第一个数,「第一个数」必须是之前没有求过的答案。 3️⃣从剩下的数中,求两数之和,求的过程中,直接去重。 两数之和,因为是有序了,所以直接双指针 细节看代码 代码 阅读全文
posted @ 2024-12-17 16:16 ouyangxx 阅读(40) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:最长回文子串问题,首先要将原字符串扩充,比如abba,暴力是以每个字符s[i],左右两边扩,如果是abba,得不到最优解,扩充成#a#b#b#a#,就不会有问题,最优解是manacher算法。 假设s[i]扩充的区域是[x, y],是目前便利到的,最远的距离,我们称i为回文中心C 阅读全文
posted @ 2024-12-16 13:55 ouyangxx 阅读(14) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:最长子串问题,考虑,以i开头的结果如何,以i结尾的结果如何,最终结果必定在其中。本题使用以i开头的结果如何,我们求出所有的「以i开头的最长子串」,再求出最长的即可。 求「以i开头的最长子串」,最简单的暴力即可,那么怎么加速呢? 我们在求「以i-1开头的最长子长串时」,假设结果是[ 阅读全文
posted @ 2024-12-16 10:01 ouyangxx 阅读(2) 评论(0) 推荐(0) 编辑
摘要:题目链接 思路 链表的方式,模拟加法的计算过程,用一个变量保存进位信息即可。 代码 class Solution { public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { // 有一种办法可以节省空间,直接将结果放在l1或者l2上 阅读全文
posted @ 2024-12-16 09:46 ouyangxx 阅读(4) 评论(0) 推荐(0) 编辑
摘要:题目链接 注意事项 1️⃣有且仅有一个正确答案。 2️⃣每个数只能使用一次。 3️⃣返回的是下标 解法一:两个for循环,找到了直接返回即可。 class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { i 阅读全文
posted @ 2024-12-16 09:32 ouyangxx 阅读(15) 评论(0) 推荐(0) 编辑
摘要:1.1 Ethemet II协议 帧格式:D.MAC + S.MAC + Type + Data + FCS D.MAC:目的MAC地址 S.MAC:源MAC地址 Type:上层使用的协议 Data:数据 FCS:帧校验序列,校验使用 一个设备收到帧时 1️⃣先检查D.MAC是不是自己,如果不是自己 阅读全文
posted @ 2024-12-11 14:57 ouyangxx 阅读(54) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示