LeetCode高频面试题
LeetCode高频面试题
剑圣土豆
Welcome
展开
-
动态规划:力扣741. 摘樱桃
1、题目描述2、题解:动态规划:参考https://leetcode-cn.com/problems/cherry-pickup/solution/dong-tai-gui-hua-xiang-xi-jie-xi-tu-jie-by-newhar/C++代码:class Solution {public: int cherryPickup(vector<vector<int>>& grid) { // 动态规划 int原创 2020-12-13 20:47:34 · 406 阅读 · 7 评论 -
动态规划 | 广度优先搜索:力扣279. 完全平方数
1、题目描述:2、题解:方法1:动态规划动态规划问题,弄清楚三点:1、重复子问题;2、最优子结构;3、无后效性。动态规划:1、状态定义;2、状态转移方程;3、初始化;base case4、输出;5、思考状态压缩。可以用递归去求,但是会存在重叠子问题,加个备忘录可以解决重复问题。python代码如下:class Solution: def numSquares(self, n: int) -> int: #动态规划 dp = [fl原创 2020-11-01 10:56:29 · 271 阅读 · 0 评论 -
数学:力扣263. 丑数
1、题目描述:2、题解:方法:数学依次循环判断如果是2,3,5的倍数,就除以2,3,5,最后判断如果num == 1就返回真,否则,返回假。Python代码如下:class Solution: def isUgly(self, num: int) -> bool: #数学 if num <= 0: return False while num % 2 == 0: num //=原创 2020-10-31 23:28:48 · 210 阅读 · 0 评论 -
动态规划 | 堆:力扣264. 丑数 II
1、题目描述:2、题解:方法:动态规划动态规划问题,弄清楚三点:1、重复子问题;2、最优子结构;3、无后效性。动态规划:1、状态定义;2、状态转移方程;3、初始化;base case4、输出;5、思考状态压缩。可以用递归去求,但是会存在重叠子问题,加个备忘录可以解决重复问题。 一个十分巧妙的动态规划问题 1.我们将前面求得的丑数记录下来,后面的丑数就是前面的丑数*2,*3,*5 2.但是问题来了,我怎么确定已知前面k-1个丑数,我怎么确定第k个丑数呢 3.采取用三个指针的原创 2020-10-31 23:22:47 · 231 阅读 · 0 评论 -
深度优先搜索DFS:力扣695. 岛屿的最大面积
1、题目描述:2、题解:类似的网格题:数学法 | 深度优先搜索DFS:力扣463. 岛屿的周长深度优先搜索DFS | 广度优先搜索BFS:力扣200. 岛屿数量方法:深度优先搜索DFS思路:dfs的定义是求一个岛屿的面积,超过边界和不为1的点都返回0,然后标记已经访问,对上左下右依次进行dfs,加到结果中。最后遍历所有的点,找出最大岛屿的面积python代码如下:class Solution: def maxAreaOfIsland(self, grid: List[List[原创 2020-10-31 11:08:45 · 949 阅读 · 0 评论 -
数学法 | 深度优先搜索DFS:力扣463. 岛屿的周长
1、题目描述2、题解:关于岛屿的题:深度优先搜索DFS | 广度优先搜索BFS:力扣200. 岛屿数量方法1:数学法思路:一个小格子会贡献4个边,但是每增加一个格子就会少2个边,所以计算格子数land和重合的边数border就可以得到结果计算公式是:4 * land - 2 * borderPython代码如下:class Solution: def islandPerimeter(self, grid: List[List[int]]) -> int:原创 2020-10-31 09:52:52 · 320 阅读 · 0 评论 -
深度优先搜索 | 后序遍历:力扣236. 二叉树的最近公共祖先
1、题目描述:2、题解:方法:深度优先搜索 ,后序遍历祖先的定义: 若节点 p 在节点 root 的左(右)子树中,或 p = root ,则称 root是 p 的祖先。最近公共祖先的定义: 设节点 root 为节点 p, q的某公共祖先,若其左子节点 root.left 和右子节点 root.right都不是 p,q的公共祖先,则称 root是 “最近的公共祖先” 。可以发现后序遍历,第一个找到的点就是最近的公共祖先。有以下三种情况:1、p和q在root的子树中,且分别是root的异侧原创 2020-10-30 22:08:56 · 219 阅读 · 0 评论 -
动态规划: 力扣91. 解码方法
1、题目描述2、题解:方法:动态规划:动态规划问题,弄清楚三点:1、重复子问题;2、最优子结构;3、无后效性。动态规划:1、状态定义;2、状态转移方程;3、初始化;base case4、输出;5、思考状态压缩。可以用递归去求,但是会存在重叠子问题,加个备忘录可以解决重复问题。状态定义: dp[i] 为以str[i]结尾前缀子串的解码数状态转移方程: (1)若s[i] != '0': dp[i] = dp[i - 1]原创 2020-10-29 21:16:42 · 234 阅读 · 0 评论 -
树:力扣617. 合并二叉树
1、题目描述:2、题解:# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: def mergeTrees(self, t1: TreeNode, t2: TreeNode) -> Tre原创 2020-09-24 23:03:13 · 201 阅读 · 0 评论 -
深度优先搜索DFS | 中序遍历:力扣538. 把二叉搜索树转换为累加树
1、题目描述:2、题解:方法一:反向中序遍历 递归二叉搜索树的中序遍历是有序的,升序,那么我们就让“右根左”,也就是先递归右子树,然后处理根节点,然后递归左子树,这样就可以降序处理,然后定义一个变量sum_存储大于此刻值的所有节点的和。Python实现:class Solution: def convertBST(self, root: TreeNode) -> TreeNode: #反向中序遍历,递归 if not root:原创 2020-09-22 08:38:56 · 244 阅读 · 0 评论 -
深度优先搜索DFS | 回溯法:力扣78. 子集
1、题目描述:2、题解:方法:深度优先搜索DFS | 回溯回溯算法框架: res = [] def backtrack(路径,选择列表): 做剪枝 if 满足结束条件: res.append(路径) return for 选择 in 选择列表: 做选择 backtrack(路径,选择列表) 撤销选择解决一个回溯问题原创 2020-09-21 22:56:50 · 289 阅读 · 0 评论 -
深度优先搜索DFS | 回溯:力扣51. N 皇后
1、题目描述:2、题解:3、复杂度分析:原创 2020-09-17 08:33:23 · 200 阅读 · 0 评论 -
栈 | 中序遍历:力扣94. 二叉树的中序遍历
1、题目描述:2、题解:方法1:递归Python实现:# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: def inorderTraversal(self, root: TreeNode原创 2020-09-16 22:52:06 · 188 阅读 · 0 评论 -
递归 | 树:力扣226. 翻转二叉树
1、题目描述:2、题解:这个题用递归,也就是先递归翻转左子树,得到left;再递归翻转右子树,得到right。然后让根节点的左、右指针分别指向两个递归的结果,也就是:root.left = right,root.right=left.python实现:# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.lef原创 2020-09-16 22:29:53 · 189 阅读 · 0 评论 -
设计 | 前缀树、字典树、Trie:力扣208. 实现 Trie (前缀树)
1、题目描述:2、题解:插入:insert()向Trie中插入一个单词word这个操作和构建链表很像。先检查,找到不到就创建。首先从根结点的子结点开始与 word 第一个字符进行匹配,一直匹配到前缀链上没有对应的字符,这时开始不断开辟新的结点,直到插入完 word 的最后一个字符,同时还要将最后一个结点isEnd = true;表示它是一个单词的末尾。查找:查找 Trie 中是否存在单词 word从根结点的子结点开始,一直向下匹配即可,如果出现结点值为空就返回false,如果匹配到了最原创 2020-09-14 16:49:57 · 206 阅读 · 0 评论 -
前缀树、字典树、Trie | 回溯 :力扣212. 单词搜索 II
1、题目描述:实现Trie(前缀树)2、题解:3、复杂度分析:原创 2020-09-14 15:17:10 · 240 阅读 · 0 评论 -
深度优先搜索DFS | 回溯:力扣79. 单词搜索
1、题目描述:2、题解:方法:深度优先搜索DFS | 回溯每次DFS都需要遍历4个方向设置二维数组visited,用来保存每次DFS遍历过的点DFS: 剪枝 终止条件 令此时所对应的visited为1 四个方向遍历: 满足边界条件且没有访问过: 如果DFS后为真,也即找到一个匹配: 就返回True 还原现场 都没找到就返回FalseDFS是从一个点的深度优先搜索,在 exis原创 2020-09-13 23:24:30 · 176 阅读 · 0 评论 -
深度优先搜索DFS | 广度优先搜索BFS:力扣637. 二叉树的层平均值(Python中zip())
1、题目描述:2、题解:方法1:广度优先搜索BFS可以把本题当成一个模板题,怎么实现层序遍历借助队列,只要队列不为空,就循环: 先记录此时队列的长度 然后循环从队列中取值 也就是队首出队,访问 然后把左、右子树(注意:有顺序之分)加入到队列中 在每一层计算平均值,加入到结果数组res中Python实现:class Solution: def averageOfLevels(self, root: TreeNode) -> List[float]:原创 2020-09-12 23:27:50 · 187 阅读 · 0 评论 -
深度优先搜索DFS | 广度优先搜索BFS | 回溯算法:力扣17. 电话号码的字母组合
1、题目描述:2、题解:3、复杂度分析:原创 2020-09-11 22:54:18 · 192 阅读 · 0 评论 -
深度优先搜索DFS + 剪枝 | 回溯:力扣216. 组合总和 III
1、题目描述:2、题解:方法:深度优先搜索DFS + 剪枝 | 回溯result = []def backtrack(选择列表,路径): if 满足结束条件: result.add(路径) return for 选择 in 选择列表: 做选择 backtrack(选择列表,路径) 撤销选择# 做选择将该选择从选择列表移除路径.add(选择)# 撤销选择路径.remove(选择)将该选择再原创 2020-09-11 11:01:13 · 126 阅读 · 0 评论 -
深度优先搜索DFS + 剪枝 | 回溯:力扣40. 组合总和 II
1、题目描述:2、题解:3、复杂度分析:原创 2020-09-11 10:07:21 · 124 阅读 · 0 评论 -
深度优先搜索DFS + 剪枝 | 回溯:力扣47. 全排列 II
1、题目描述:2、题解:数据结构和算法:从0到1系列 回溯小专题深度优先搜索DFS | 回溯算法:力扣46. 全排列result = []def backtrack(选择列表,路径): if 满足结束条件: result.add(路径) return for 选择 in 选择列表: 做选择 backtrack(选择列表,路径) 撤销选择# 做选择将该选择从选择列表移除路径.add(选择)#原创 2020-09-10 23:15:56 · 140 阅读 · 0 评论 -
深度优先搜索DFS + 剪枝 | 回溯:力扣39. 组合总和
1、题目描述:2、题解:方法:深度优先搜索DFS + 剪枝,+回溯也是可以套用回溯模板:对于dfs函数 ,传进来三个值,路径path,路径里的和sum_,枚举选择的起点start: 如果sum_ > target:剪枝 如果sum_ == target:满足条件添加进结果数组res中 循环,从start开始做枚举:(因为可以重复,所以从start开始,且向下选择的时候i值不改变;并且因为每次都是从start开始往后遍历,所以可以去除[2,2,3],[2,3,2]这种原创 2020-09-10 09:51:52 · 153 阅读 · 0 评论 -
深度优先搜索DFS + 剪枝 | 回溯:力扣77. 组合
1、题目描述:2、题解:3、复杂度分析:原创 2020-09-09 22:47:03 · 211 阅读 · 0 评论 -
单调栈巧妙解决面试常考题:力扣739. 每日温度
1、题目描述:2、题解:单调栈:力扣496. 下一个更大元素 I单调栈:力扣503. 下一个更大元素 II思路:stack为单调栈,保存的下标(从栈底到栈顶的元素所对应的nums的值单调不增,也可以理解为下降的)遍历一遍数组: 循环处理:stack不为空 && 当前的nums中的值比栈顶元素所对应的nums值大 保存栈顶元素为temp,且使stack出栈 就让结果数组temp所对应的位置的值 等于 当前下标 - temp 下标放入sta原创 2020-09-08 23:30:35 · 192 阅读 · 1 评论 -
单调栈:力扣503. 下一个更大元素 II
1、题目描述:2、题解:方法:单调栈思路:stack为单调栈,保存的下标(从栈底到栈顶的元素所对应的nums的值单调不增,也可以理解为下降的)遍历一遍数组的长度的两倍: 循环处理:stack不为空 && 当前的nums中的值比栈顶元素所对应的nums值大 就让结果数组栈顶元素所对应的位置的值 等于 此时的nums中的值 stack出栈 下标取余放入stack中返回resPython实现:class Solution:原创 2020-09-08 21:21:02 · 185 阅读 · 0 评论 -
单调栈:力扣496. 下一个更大元素 I
1、题目描述:2、题解:方法1:暴力法思路:两次循环: 遍历nums1: 设置变量temp= num 对nums1中的每一个元素num,遍历num在nums2中之后的值: 记录第一个比temp大的元素,找到后break 判断一下,如果没找到,就记录-1 返回记录的值class Solution: def nextGreaterElement(self, nums1: List[int], num原创 2020-09-08 09:38:43 · 172 阅读 · 0 评论 -
哈希表:力扣347. 前 K 个高频元素
1、题目描述:2、题解:方法1:哈希表 + 数组 + 排序先把统计数组中元素出现的次数,放在哈希表中,key是数组元素,value是出现次数。然后放在数组中对数组排序遍历得到频率前k高的元素Python实现:class Solution: def topKFrequent(self, nums: List[int], k: int) -> List[int]: #哈希表 + 数组 + 排序 hashmap = {} n = len(原创 2020-09-07 23:42:01 · 186 阅读 · 0 评论 -
栈 | 单调栈 :力扣84. 柱状图中最大的矩形
1、题目描述:2、题解:方法1:单调栈思路:设定一个栈,保存数组的下标(遍历过程中,顶底到栈顶的值所对应的heights数组中的值是递增的。)把原数组的前后增加0值,这样后面就不用判断栈是否是空然后循环遍历数组: 循环处理,如果当前的高度小于栈顶所对应heights数组的的值: 取出栈顶元素,计算取出的栈顶元素所对应的heighs值h 计算宽度:distance = i - stack[-1] - 1 更新res,res = max(r原创 2020-09-07 09:41:03 · 176 阅读 · 0 评论 -
排序 | 哈希表 | 摩尔投票:力扣169. 多数元素(也就是求众数)
1、题目描述:2、题目:可以同时做一下力扣方法1:排序因为众数必定存在,所以可以排序后,返回中间值,中间值一定是众数。Python:class Solution: def majorityElement(self, nums: List[int]) -> int: #排序 nums.sort() return nums[len(nums) // 2]C++:class Solution {public: int maj原创 2020-09-05 22:48:50 · 229 阅读 · 0 评论 -
动态规划:力扣673. 最长递增子序列的个数
1、题目描述:2、题解:3、复杂度分析:原创 2020-09-04 23:00:11 · 181 阅读 · 0 评论 -
动态规划:力扣1143. 最长公共子序列
1、题目描述:2、题解:方法:动态规划:这次从递归开始到记忆化递归,再到动态规划动态规划问题,弄清楚三点:1、重复子问题;2、最优子结构;3、无后效性。动态规划:1、状态定义;2、状态转移方程;3、初始化;base case4、输出;5、思考状态压缩。可以用递归去求,但是会存在重叠子问题,加个备忘录可以解决重复问题。状态定义:dp[i][j],表示text1的第i个字符结尾的字符串与text2的第j个字符结尾的字符串的最长公共子序列,也就word1[0:i],word2[0原创 2020-09-04 15:54:59 · 211 阅读 · 0 评论 -
滑动窗口 : 力扣674. 最长连续递增序列
1、题目描述:2、题解:方法1:滑动窗口一次扫描,设置一个变量temp,用来保存连续递增的子序列的个数,然后扫描: 遇到递增就让temp ++, 否则, 就更新res(最长的连续递增子序列的长度),指针移动。最后返回res,和temp中的最大值class Solution: def findLengthOfLCIS(self, nums: List[int]) -> int: if not nums : return 0原创 2020-09-03 15:53:13 · 266 阅读 · 0 评论 -
动态规划:逐步优化,逐层递进,力扣486. 预测赢家
1、题目描述:2、题解:方法:动态规划:这次从递归开始到记忆化递归,再到动态规划动态规划问题,弄清楚三点:1、重复子问题;2、最优子结构;3、无后效性。动态规划:1、状态定义;2、状态转移方程;3、初始化;base case4、输出;5、思考状态压缩。可以用递归去求,但是会存在重叠子问题,加个备忘录可以解决重复问题。方法1:递归:定义一个helper()函数,功能是返回数组[i:j]之间当前做选择的玩家赢过对手的分数。如果大于零,则代表他在这个子问题中赢了。递归函数内原创 2020-09-01 23:34:29 · 943 阅读 · 0 评论 -
深度优先搜索DFS | 广度优先搜索BFS:力扣491. 递增子序列
1、题目描述:2、题解:方法1:深度优先搜索DFS3、复杂度原创 2020-09-01 14:49:29 · 197 阅读 · 0 评论 -
深度优先搜索DFS | 回溯 |广度优先搜索BFS | 动态规划:力扣22. 括号生成
1、题目描述:2、题解:3、复杂度分析:原创 2020-08-31 22:45:39 · 256 阅读 · 0 评论 -
深度优先搜索DFS | 广度优先搜索BFS:力扣841. 钥匙和房间
1、题目描述:2、题解:本题其实是求DFS或BFS后,判断访问过的长度是否与rooms的长度相等:若相等,则为True;否则,为False。方法1:DFS,递归就是标准的DFS,可以套用模板:数据结构和算法 从0到1:图的深度优先搜索DFS,注意本题只能从0号房间开始,题中有说明代码如下:class Solution: def canVisitAllRooms(self, rooms: List[List[int]]) -> bool: #DFS n原创 2020-08-31 16:02:20 · 133 阅读 · 0 评论 -
动态规划:力扣552. 学生出勤记录 II
1、题目描述:2、题解:方法1:暴力法,超时思路:用gen(s,n)生成所有'A','P','L'所组成的字符串,然后用551题的方法判断是否可以奖励对于gen(s,n),在递归函数的每一层分别在输入字符串后面加上'A','P','L',剩余长度n - 1,分别进行递归其中,每个gen()前面的if语句,有剪枝的作用代码实现:class Solution: def checkRecord(self, n): #暴力法,超时 # 用gen(s,n)生成原创 2020-08-31 14:54:42 · 120 阅读 · 0 评论 -
字符串:力扣557. 反转字符串中的单词 III
1、题目描述:2、题解:方法1:思路:把字符串按照空格分割并转化为数组,然后对数组中的每一个元素(字符串),进行翻转,放进res中代码如下:class Solution: def reverseWords(self, s: str) -> str: #暴力法,思想:把字符串按照空格分割并转化为数组,然后对数组中的每一个元素(字符串),进行翻转,放进res中 s_revers = s.split() res = []原创 2020-08-31 00:12:38 · 159 阅读 · 0 评论 -
链表:力扣面试题 02.05. 链表求和
1、题目描述:2、题解:思路:设定哑结点p = pre = ListNode(-1),其后保存两个链表相加的结果,也就是返回pre.next。用flag保存进位,先同时移动l1,l2, 每次都是temp = (l1.val + l2.val + flag) % 10,作为该位置的结果(一定要加进位) p.next = ListNode(temp) 更新flag,flag = (l1.val + l2.val + flag) // 10 移动l1,l2,p这时候原创 2020-08-30 18:29:25 · 158 阅读 · 0 评论