LeetCode
记录刷题过程、想法、思考
稚嫩的劢劢
上海交通大学金融硕士在读,对Python、算法、Linux、量化交易感兴趣
展开
-
剑指 Offer 25. 合并两个排序的链表(双指针)
题目描述文章目录双指针双指针# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution: def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode: if not l原创 2021-10-26 19:33:52 · 216 阅读 · 0 评论 -
剑指 Offer 22. 链表中倒数第k个节点(双指针)
题目描述文章目录双指针双指针同时初始化两个指针指向head,接着先遍历node1,并记录下当前遍历到的节点个数记为n,当 n>kn > kn>k 时,开始遍历node2,注意这里要先判断是否遍历node2,再遍历node1,这样当node1遍历完毕时就能跳出循环# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val = x#原创 2021-10-19 20:10:59 · 227 阅读 · 0 评论 -
剑指 Offer 18. 删除链表的节点(双指针)
题目描述文章目录双指针双指针# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution: def deleteNode(self, head: ListNode, val: int) -> ListNode: if head.val ==原创 2021-10-19 19:20:19 · 194 阅读 · 0 评论 -
剑指 Offer 48. 最长不含重复字符的子字符串(动态规划、双指针、哈希表)
题目描述文章目录方法一:线性遍历(本质上是双指针)方法二:动态规划+哈希表方法三:双指针+哈希表方法一:线性遍历(本质上是双指针)使用一个变量current用于保存当前遍历的最长子串,会有两种情况:若当前字符不在current中,则将其添加至current若当前字符在current中,则先将至此形成的current的长度与最长子串长度res作比较,再将current中原有的这一字符剔除,并将当前字符添加至currentclass Solution: def lengthOfLonge原创 2021-10-07 21:29:36 · 162 阅读 · 0 评论 -
剑指 Offer 46. 把数字翻译成字符串(动态规划)
题目描述文章目录动态规划动态规划使用f(n)f(n)f(n)表示以当前第nnn个数结尾的翻译个数,则有两种情况:若第nnn个数与前一个数(n−1n-1n−1)组成的数≤25,则有一种新的组合方式;此外,当前这个数自身也是一种翻译方法。若第nnn个数与前一个数(n−1n-1n−1)组成的数>25,则只有当前这个数自身这一种翻译方法故可以推出递推公式为f(n)={f(n−1)+f(n−2),情形1f(n−1),情形2f(n) = \left\{\begin{array}{lr}f(n-原创 2021-10-07 18:48:47 · 110 阅读 · 0 评论 -
剑指 Offer 47. 礼物的最大价值(动态规划)
题目描述文章目录方法一:动态规划方法一:动态规划设置一个结果数组maxvalue_grid用于保存遍历至对应位置时的最大价值,则可得递推公式为maxvalue_grid[i][j]=max(maxvalue_grid[i][j−1],maxvalue_grid[i−1][j])+grid[i][j]maxvalue\_grid[i][j] = \max(maxvalue\_grid[i][j-1], maxvalue\_grid[i-1][j]) + grid[i][j]maxvalue_gr原创 2021-10-06 21:32:06 · 117 阅读 · 0 评论 -
剑指 Offer 42. 连续子数组的最大和(动态规划)
题目描述文章目录方法一:动态规划方法一:动态规划这里设定f(n)f(n)f(n)为包含当前第nnn个数num的最大连续子数组和,则可以写出递推公式为f(n)=max(num,f(n−1)+num)f(0)=nums[0]f(n) = \max(num, f(n-1)+num)\\f(0) = nums[0]f(n)=max(num,f(n−1)+num)f(0)=nums[0]注意这里递推公式中不是f(n)=max(f(n−1),f(n−1)+num)f(n) = \max(f(n-原创 2021-10-06 21:13:59 · 136 阅读 · 0 评论 -
剑指 Offer 63. 股票的最大利润(动态规划)
题目描述添加链接描述方法一:一次遍历参考解法class Solution: def maxProfit(self, prices: List[int]) -> int: minprice = 10**9 # 记录历史最低价 maxprofit = 0 # 记录最大利润 for price in prices: maxprofit = max(maxprofit, price - minprice)原创 2021-10-06 11:52:29 · 1732 阅读 · 0 评论 -
剑指 Offer 10- II. 青蛙跳台阶问题(动态规划)
题目描述动态规划这里可以推得递推公式为,要注意,当跳到f(n−2)f(n-2)f(n−2)时,本来可以有两种方式跳到f(n)f(n)f(n),但一步一步跳的方式与从f(n−1)f(n-1)f(n−1)跳到f(n)f(n)f(n)的方式重复,因此也只有一种方式f(n)=f(n−1)+f(n−2)f(0)=f(1)=1f(n)=f(n-1)+f(n-2)\\f(0)=f(1)=1f(n)=f(n−1)+f(n−2)f(0)=f(1)=1class Solution: def numWays原创 2021-10-06 11:31:09 · 104 阅读 · 0 评论 -
剑指 Offer 10- I. 斐波那契数列(快速幂)
题目描述文章目录方法一方法一用列表保存斐波那契数列,并在每一步取模,以防溢出class Solution: def fib(self, n: int) -> int: if n <= 1: return n F = [0, 1] for i in range(2, n+1): F.append((F[i-2] + F[i-1]) % (1e9+7)) # 要在这一步就取模,否则最后原创 2021-10-01 12:22:59 · 146 阅读 · 0 评论 -
剑指 Offer 28. 对称的二叉树
题目描述文章目录递归递归# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: def isSymmetric(self, root: TreeNode) -> bool:原创 2021-09-29 12:28:14 · 97 阅读 · 0 评论 -
剑指 Offer 27. 二叉树的镜像
题目描述文章目录递归遍历+交换递归遍历+交换# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: def mirrorTree(self, root: TreeNode) -> TreeN原创 2021-09-29 11:30:33 · 106 阅读 · 0 评论 -
剑指 Offer 26. 树的子结构(非常精妙)
题目描述参考解法学习这种递归的调用# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: def isSubStructure(self, A: TreeNode, B: TreeNode) -&原创 2021-09-28 21:44:38 · 95 阅读 · 0 评论 -
剑指 Offer 32 - III. 从上到下打印二叉树 III
题目描述文章目录方法一方法二:层序遍历 + 双端队列(奇偶层逻辑分离)方法一依旧按每层从左到右的顺序保存和输出,另设置layer变量指示当前层数,若为偶数层则顺序,奇数层则逆序# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Nonec原创 2021-09-28 18:27:37 · 137 阅读 · 0 评论 -
剑指 Offer 32 - II. 从上到下打印二叉树 II(广度优先搜索)
题目描述文章目录方法一:使用队列保存每层列表方法一:使用队列保存每层列表# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: def levelOrder(self, root: TreeNod原创 2021-09-28 17:05:59 · 118 阅读 · 0 评论 -
剑指 Offer 32 - I. 从上到下打印二叉树(广度优先搜索)
题目描述参考解法注意 collections 中的双端队列 deque() 的使用# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: def levelOrder(self, root: Tr原创 2021-09-25 13:14:08 · 109 阅读 · 0 评论 -
剑指 Offer 50. 第一个只出现一次的字符
题目描述文章目录方法一:建立两个辅助列表,遍历字符串方法二:使用字典计数方法三:使用字典保存字符出现的索引方法一:建立两个辅助列表,遍历字符串class Solution: def firstUniqChar(self, s: str) -> str: uniq_list = [] repeat_list = [] for char in s: if char not in uniq_list and char no原创 2021-09-23 21:04:49 · 93 阅读 · 0 评论 -
剑指 Offer 53 - II. 0~n-1中缺失的数字
题目描述文章目录方法一:直接遍历方法二:二分法方法一:直接遍历class Solution: def missingNumber(self, nums: List[int]) -> int: for index, num in enumerate(nums): if index != num: return index return len(nums) # 遍历一遍后都存在,那么就是最后一个数不原创 2021-09-23 11:44:11 · 79 阅读 · 0 评论 -
剑指 Offer 53 - I. 在排序数组中查找数字 I
题目描述文章目录方法一:二分查找+遍历方法二:用两次二分查找方法一:二分查找+遍历先使用二分查找找到target第一次出现的索引,再从索引处开始遍历class Solution: def search(self, nums: List[int], target: int) -> int: index = self.binary_search(nums, target) if index == -1: return 0原创 2021-09-22 20:01:21 · 89 阅读 · 0 评论 -
剑指 Offer 03. 数组中重复的数字(学习原地交换解法)
题目描述文章目录方法一:建立一个列表保存出现过的值方法二:交换数组元素方法一:建立一个列表保存出现过的值class Solution: def findRepeatNumber(self, nums: List[int]) -> int: repeat_list = [] for num in nums: if num in repeat_list: return num el原创 2021-09-22 13:08:19 · 102 阅读 · 0 评论 -
剑指 Offer 05. 替换空格
题目描述方法一:遍历,构造辅助串class Solution: def replaceSpace(self, s: str) -> str: result = '' for i in s: if i == ' ': result += '%20' else: result += i return result方法二:使用pyt原创 2021-09-10 18:07:41 · 68 阅读 · 0 评论 -
剑指 Offer 35. 复杂链表的复制(链表、递归)
题目描述官方解法文章目录方法1:回溯 + 哈希表方法1:回溯 + 哈希表本题要求我们对一个特殊的链表进行深拷贝。如果是普通链表,我们可以直接按照遍历的顺序创建链表节点。而本题中因为随机指针的存在,当我们拷贝节点时,「当前节点的随机指针指向的节点」可能还没创建,因此我们需要变换思路。一个可行方案是,我们利用回溯的方式,让每个节点的拷贝操作相互独立。对于当前节点,我们首先要进行拷贝,然后我们进行「当前节点的后继节点」和「当前节点的随机指针指向的节点」拷贝,拷贝完成后将创建的新节点的指针返回,即可完成当前原创 2021-09-10 17:52:33 · 435 阅读 · 0 评论 -
剑指 Offer 24. 反转链表(学习递归)
题目描述官方解答文章目录方法1:迭代方法二:递归(巧妙)方法1:迭代# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution: def reverseList(self, head: ListNode) -> ListNode: c原创 2021-08-31 20:39:08 · 87 阅读 · 0 评论 -
剑指 Offer 06. 从尾到头打印链表(数组、递归)
题目描述文章目录方法1:列表倒置方法2:递归(学习)方法1:列表倒置# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution: def reversePrint(self, head: ListNode) -> List[int]:原创 2021-08-31 19:44:25 · 104 阅读 · 0 评论 -
剑指 Offer 30. 包含min函数的栈(非常巧妙)
题目描述官方解法面试题30. 包含 min 函数的栈(辅助栈,清晰图解)class MinStack: def __init__(self): self.A, self.B = [], [] def push(self, x: int) -> None: self.A.append(x) if not self.B or self.B[-1] >= x: self.B.append(x) d原创 2021-08-30 21:02:16 · 107 阅读 · 0 评论 -
剑指 Offer 09. 用两个栈实现队列
题目描述文章目录方法1(倒腾两次)方法2(官方解法,只用倒腾一次)方法1(倒腾两次)用两个栈来回倒腾class CQueue: def __init__(self): self.stack1 = [] # 临时栈 self.stack2 = [] # 主栈 def appendTail(self, value: int) -> None: # 若主栈空则直接放主栈 if len(self.sta原创 2021-08-30 20:32:38 · 94 阅读 · 0 评论 -
LeetCode 剑指 Offer 11. 旋转数组的最小数字(Python、二分查找)
文章目录方法一:找非单调增的点题目描述方法一:找非单调增的点class Solution: def minArray(self, numbers: List[int]) -> int: smallest = numbers[0] for i in numbers: if i < smallest: return i return smallest...原创 2021-01-21 18:58:46 · 294 阅读 · 3 评论 -
LeetCode 剑指 Offer 05. 替换空格(Python)
文章目录方法一:简单遍历题目描述方法一:简单遍历class Solution: def replaceSpace(self, s: str) -> str: res = '' for i in s: if i == ' ': res += '%20' else: res += i return res...原创 2021-01-18 20:11:10 · 115 阅读 · 0 评论 -
LeetCode 剑指 Offer 04. 二维数组中的查找(Python、线性查找)
题目描述文章目录方法一:不断缩小范围方法二:线性查找方法一:不断缩小范围根据数组两个维度上的递增特性,可以总结出这样的算法,如果 matrix[i][j]>target,那么搜索的列范围就可以缩小到 j。class Solution: def findNumberIn2DArray(self, matrix: List[List[int]], target: int) -> bool: if not matrix: return False原创 2021-01-12 19:22:25 · 187 阅读 · 0 评论 -
LeetCode 152. 乘积最大子数组(Python、动态规划)
“最大子数组和”的变型题目描述动态规划思路和算法如果我们用 fmax(i)f_{\max}(i)fmax(i) 来表示以第 iii 个元素结尾的乘积最大子数组的乘积,aaa 表示输入参数 numsnumsnums,那么根据「53. 最大子序和」的经验,我们很容易推导出这样的状态转移方程:fmax(i)=maxi=1n{f(i−1)×ai,ai}f_{\max}(i) = \max_{i = 1}^{n} \{ f(i - 1) \times a_i, a_i \}fmax(i).原创 2020-12-24 20:35:08 · 732 阅读 · 1 评论 -
LeetCode 53. 最大子序和(Python、动态规划、分治(线段树))
学习分治(线段树) 的应用,同时记住递归的空间复杂度(栈的深度)题目描述文章目录方法一:动态规划方法二:分治方法一:动态规划思路和算法假设 nums 数组的长度是 nnn,下标从 000 到 n−1n - 1n−1。我们用 aia_iai 代表 nums[i]nums[i]nums[i],用 dp(i)dp(i)dp(i) 代表以第 iii 个数结尾的「连续子数组的最大和」,那么很显然我们要求的答案就是:max0≤i≤n−1f(i)\max_{0 \leq i \leq n - 1.原创 2020-12-24 14:35:08 · 462 阅读 · 0 评论 -
LeetCode15. 三数之和
学习双指针的运用题目描述文章目录方法一:暴力解法(三个循环)方法二:排序 + 双指针方法一:暴力解法(三个循环)class Solution: def threeSum(self, nums: List[int]) -> List[List[int]]: nums.sort() result = [] for i in range(len(nums)): for j in range(i+1, len(nums.原创 2020-11-17 00:56:14 · 681 阅读 · 0 评论 -
LeetCode 14. 最长公共前缀(Python、二分查找)
题目描述文章目录方法一:纵向扫描方法一:纵向扫描遍历第一个字符串,与列表中的其他字符串的相同位置字符逐一比对class Solution: def longestCommonPrefix(self, strs: List[str]) -> str: if len(strs) == 0: return '' common_prefix = '' for i, cur in enumerate(strs[0]):原创 2020-11-12 00:49:54 · 397 阅读 · 1 评论 -
LeetCode 11. 盛最多水的容器(Python、双指针)
题目描述学习双指针法的应用文章目录解题思路解题思路官方解法class Solution: def maxArea(self, height: List[int]) -> int: result = 0 left = 0 right = len(height) - 1 while(right > left): area = (right - left) * min(height[left原创 2020-11-03 20:13:07 · 775 阅读 · 0 评论 -
LeetCode 10. 正则表达式匹配(Python)
题目描述学习动态规划的应用文章目录解题思路解题思路官方解法class Solution: def isMatch(self, s: str, p: str) -> bool: m, n = len(s), len(p) def match(i: int, j: int) -> bool: # 前0个字符为空字符,直接返回False if i == 0: retu原创 2020-11-03 11:51:17 · 280 阅读 · 0 评论 -
LeetCode 9. 回文数(Python)
题目描述学习回文数的解法文章目录方法一:取反方法二:后半部分取反方法一:取反逐个弹出,形成x反过来读形成的数class Solution: def isPalindrome(self, x: int) -> bool: # 若x为负数,则一定不是回文数 if x < 0: return False reverse = 0 temp = x while t原创 2020-10-29 10:57:20 · 301 阅读 · 1 评论 -
LeetCode 8. 字符串转换整数 (atoi)(Python)
题目描述文章目录方法一:逐个判断方法一:逐个判断class Solution: def myAtoi(self, s: str) -> int: # 字符串为空 if len(s) == 0: return 0 num_str = '0123456789' sign_str = '+-' valid_str = sign_str + num_str num_char =原创 2020-10-28 11:22:07 · 366 阅读 · 0 评论 -
LeetCode 7. 整数反转
题目描述文章目录方法一:转化为字符串方法二:求出各位数字后反转方法三:末位弹出方法一:转化为字符串将x转化为字符串,直接反转class Solution: def reverse(self, x: int) -> int: str_x = str(x) if str_x[0] == '-': reverse_x = str_x[:0:-1] reverse_num = int('-' + reverse_x原创 2020-10-26 20:41:28 · 134 阅读 · 0 评论 -
LeetCode 6. Z 字形变换
题目描述文章目录解题思路代码解题思路建立一个字符列表,其中的元素表示各行包含的Z型字符来回遍历这个列表,依次将字符串的下一个字符添加进当前遍历元素的末尾连接这个列表的元素,返回结果代码class Solution: def convert(self, s: str, numRows: int) -> str: Z_list = ['' for _ in range(numRows)] it = iter(s) i = 0原创 2020-10-19 20:15:14 · 233 阅读 · 0 评论 -
LeetCode 5. 最长回文子串
文章目录方法一:暴力解法题目描述方法一:暴力解法遍历所有的子串,判断是否为回文字符串class Solution: def longestPalindrome(self, s: str) -> str: if len(s) < 2: return s begin = 0 maxlength = 1 for i in range(len(s)-1): for j in r原创 2020-10-14 21:44:21 · 104 阅读 · 0 评论