LeetCode
Bernard_Yang
致力将晦涩难懂的东西讲明白
展开
-
Leetcode 93 复原ip地址
切割问题就可以使用回溯搜索法把所有可能性搜出来。原创 2022-11-27 16:15:20 · 244 阅读 · 0 评论 -
Leetcode 90. 子集 II
相比子集问题,多了一个限制条件就是不能有重复,对应代码部分为先对nums排序,然后在for循环中判断i和startIndex关系,若大于且nums[i] == nums[i-1],则跳过当前选择class Solution: def subsetsWithDup(self, nums: List[int]) -> List[List[int]]: path = [] paths = [] def backtrack(nums, startIn.原创 2022-01-03 02:39:25 · 494 阅读 · 0 评论 -
Leetcode 78 子集
每次递归先将当前path内的子集添加到pathsclass Solution: def subsets(self, nums: List[int]) -> List[List[int]]: path = [] paths = [] def backtrack(nums, startIndex): paths.append(path[:]) if startIndex == len(nums):.原创 2022-01-03 02:37:27 · 3377 阅读 · 0 评论 -
Leetcode 131. 分割回文串
base case为开始索引startIndex 大于等于字符串长度,则找到一组答案class Solution: def partition(self, s: str) -> List[List[str]]: path = [] paths = [] def backtrack(s, startIndex): if startIndex >= len(s): paths.app.原创 2022-01-03 02:34:16 · 3162 阅读 · 0 评论 -
Leetcode 17. 电话号码的字母组合
class Solution: def letterCombinations(self, digits: str) -> List[str]: answers = [] answer = [] letter_map = { '2': 'abc', '3': 'def', '4': 'ghi', '5': 'jkl', .原创 2022-01-03 02:32:08 · 3004 阅读 · 0 评论 -
Leetcode 51. N 皇后
思路class Solution: def solveNQueens(self, n: int) -> List[List[str]]: if not n: return [] chessboard = [['.'] * n for _ in range(n)] res = [] def isValid(row, col, chessboard): #检查列 for i in ..原创 2021-12-12 23:33:51 · 2061 阅读 · 0 评论 -
Leetcode 77 组合
思路class Solution: def combine(self, n: int, k: int) -> List[List[int]]: paths = [] path = [] def backtrack(n, k, start): if len(path) == k: paths.append(path[:]) for i in range(star.原创 2021-12-07 22:02:28 · 179 阅读 · 0 评论 -
Leetcode 40 组合总和 II
思路来自代码随想录class Solution: def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]: paths = [] path = [] used = [0] * len(candidates) def backtrack(candidates, target, sum_, start_index): .原创 2021-12-07 21:55:23 · 1848 阅读 · 0 评论 -
Leetcode 39 组合总和
解题思路paths存放最终结果,path用于记录回溯过程中当前的结果backtrack参数sum_记录当前节点达到的和,也就是path的总和另外为了清晰的记录每个组合开始数字的索引,引入start_index,避免重复考虑class Solution: def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]: paths = [] path = [.原创 2021-12-02 20:33:34 · 1897 阅读 · 0 评论 -
Leetcode 47. 全排列 II
解题思路相比46题主要变化在于需要维护一个used数组(位置上的值为0代表当前数字在当前层没有被考虑过或者经过回溯之后已经被考虑过)当前位置的数字没有出现过if not used[i]: 当前位置的数字和前一个一样且前一个数字经过回溯之后已经被考虑则跳过当前的选择 if i>0 and nums[i] == nums[i-1] and not used[i-1]: continueclass Solution: def permuteUni.原创 2021-12-02 20:18:17 · 87 阅读 · 0 评论 -
Leetcode 46 全排列
path记录排列的过程,如果长度满足3则达到递归终止条件,记录结果并class Solution: def permute(self, nums: List[int]) -> List[List[int]]: res = [] #存放符合条件结果的集合 path = [] #用来存放符合条件的结果 def backtrack(nums): if len(path) == len(nums): .原创 2021-11-29 16:01:32 · 1459 阅读 · 0 评论 -
Leetcode 98 验证二叉搜索树
辅助函数isBst携带了额外的信息帮助判断是否左节点小于根节点或右节点大于根节点class Solution: def isValidBST(self, root: TreeNode) -> bool: def isBst(root, lower=float('-inf'), upper=float('inf')): if root.val <= lower or upper <= root.val: re.原创 2021-11-21 16:07:59 · 77 阅读 · 0 评论 -
Leetcode 752 打开转盘锁
解题思路plusOne和minusOne分别用于计算拨动一位之后的密码锁数字,单向bfs中每次取一组数字,初始为‘0000’,然后依次判断是否为deadend或target,都不是则依次进行向上或向下拨动1操作然后加入到待考察队列(q)以及出现过数字的队列(visited),判断结束之后操作步数+1class Solution: def openLock(self, deadends: List[str], target: str) -> int: def plusOne.原创 2021-11-18 15:57:43 · 148 阅读 · 0 评论 -
Leetcode 563 二叉树的坡度
# Definition for a binary tree node.# class TreeNode:# def __init__(self, val=0, left=None, right=None):# self.val = val# self.left = left# self.right = rightclass Solution: def findTilt(self, root: TreeNode) -> in.原创 2021-11-18 15:44:37 · 308 阅读 · 0 评论 -
Leetcode 111 二叉树最小深度
分别用BFS和递归求解,BFS每次将一个节点入队,遍历过程中每次将该节点出队并依次判断该节点是否为叶子结点,若是则结束遍历并返回当前深度,若有子节点则将子节点入队然后将当前深度+1继续下一次遍历递归函数定义为考虑以当前root为根节点的二叉树的深度# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = .原创 2021-11-16 20:35:40 · 394 阅读 · 0 评论 -
Leetcode 337 打家劫舍 III
解题思路在于helper函数的定义,代表了考虑当前房屋(root)之后所能带来的收益,返回值包括了抢(do)与不抢(not do)当前房屋的数值(数组的0和1)如果决定抢当前房屋则不考虑左右节点,如果不抢则分别考虑左右节点中抢与不抢结果大的值,然后相加class Solution: def rob(self, root: TreeNode) -> int: #递归暴力 #考虑root节点带来的最大收益 def helpe.原创 2021-11-14 02:52:34 · 2249 阅读 · 0 评论 -
Leetcode 213 打家劫舍 II
该题相比上一题增加了限制条件就是房子首尾相连,那么这时需要考虑抢劫的情况有三种:1)不抢首尾的房子;2)只抢首;3)只抢尾(图片来源已注明)这时只需要考虑情况2和3即可,因为包括了情况一class Solution: def rob(self, nums: List[int]) -> int: """ :type nums: List[int] :rtype: int """ n = len(nums).原创 2021-11-13 00:55:21 · 368 阅读 · 0 评论 -
Leetcode 198 打家劫舍
class Solution: def rob(self, nums: List[int]) -> int: if not nums: return 0 n = len(nums) memo = [-1 for i in range(n)] memo[n - 1] = nums[n - 1] for i in range(n-2, -1, -1): for j in.原创 2021-11-12 07:23:22 · 1595 阅读 · 0 评论 -
LeetCode72.Edit Distance 编辑距离
给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符示例 1:输入:word1 = “horse”, word2 = “ros”输出:3解释:horse -> rorse (将 ‘h’ 替换为 ‘r’)rorse -> rose (删除 ‘r’)rose -> ros (删除 ‘e’)示例 2:输入:word1 = “intention”原创 2021-09-22 06:12:52 · 61 阅读 · 0 评论