leecode
Not_Today.
道法自然
展开
-
二维数组相关题目 力扣 Python
解题思路:解法 1. 主对角线反转加竖直反转。解法 2. 水平反转加主对角线反转。73. 矩阵置零解题思路:题目要求常量空间且原地解决。利用矩阵的第一行和第一列来标记有 0 的行与列。498. 对角线遍历解题思路:118. 杨辉三角解题思路:模拟边界两边各为 1第 i 行的元素 j 为第 i - 1 行的元素 j - 1 和 j 的和119. 杨辉三角 II解题思路:与 118 逻辑相同还是模拟,不同的是输出给定的索引行。使用一个数组,进行两重循环遍历。先遍历 k 行,再对每一行原创 2022-07-06 16:05:46 · 1047 阅读 · 0 评论 -
二叉树 BFS 力扣 Python
解题思路:层序遍历的顺序为从上到下,从左到右依次遍历。从上到下是通过访问根节点的左右子树遍历。从左到右是记录每一层的节点个数,以下代码的 level 就是这个作用,这里使用了双端队列是为了推广性,如下题 103, z 形循环记录每层的结点,用列表也是可以的。103. 二叉树的锯齿形层序遍历解题思路:定义一个 flag作为记录,奇数正向,偶数逆向。双端队列可以很方便的前后增加元素。107. 二叉树的层序遍历 II解题思路:如题 102,这道题只颠倒每层记录的节点顺序就可以。注意一点,相信很多人想原创 2022-07-01 23:34:47 · 277 阅读 · 0 评论 -
222. 完全二叉树的节点个数 (Python)
解题思路:根据题意,完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。所以一棵树的左子树或右子树为完全二叉树,那么部分子树可以使用公式的方式直接计算出,这将节省通过逐层递归来计算节点的个数。所以当一个节点的左子树和右子树高度相同时,那么这棵树为完全二叉树。对于完全二叉树的左右子树,其有一半肯定是完全的。所以完全的部分使用公式计算。综合来讲,递归深度为树的高度是 log N,每次递归所花费的时间就是 while 循原创 2022-07-01 19:16:32 · 301 阅读 · 0 评论 -
二叉树与二叉搜索树的公共祖先 力扣 (Python)
解题思路:判断二叉树的公共祖先由以下三种情况组成。235. 二叉搜索树的最近公共祖先解题思路:当考虑二叉搜索树的公共祖先时,要结合二叉搜索树的性质。以上的两题均可以用以下方式解决。二叉搜索树其实是特殊的二叉树。而对于二叉树的最小公共祖先来说,以下代码包含了问题一的三种判断情况。...原创 2022-07-01 18:56:49 · 251 阅读 · 0 评论 -
二叉搜索树相关题目总结(二) 力扣 Python
前文 二叉搜索树相关题目总结(一) 中,主要是涉及二叉搜索树中的一些操作。这篇文章是列举两道与构造 BST 有关的题目。解题思路:给定一个 n, 问从 1 到 n 能组成互不相同的 BST 有几种?简单来看,就是穷举所有可能的树,然后算一下结果。第一种方法,递归 DFS, 也是回溯的一种体现。加入了名为 cache 的数组,也就是 dp 数组用于消除子问题重叠。解法二:其实和解法一一致,只不过引入了 lru_cache 包,可以理解为一个隐式 cache 装饰器,用于自动缓存子问题。代码相对于简洁。解法原创 2022-06-30 22:53:15 · 138 阅读 · 0 评论 -
二叉搜索树相关题目总结(一) 力扣 Python
总结一下与二叉搜索树有关的题目,解决思路都是二叉搜索树的相关操作。解题思路:验证一颗树是不是二叉搜索树(BST)?依据二叉搜索树的性质写出代码,如下注释。700. 二叉搜索树中的搜索解题思路:利用 BST 的特性,进行搜索。如果当前节点小于目标值就去右子树查找。如果当前节点大于目标值就去左子树查找。701. 二叉搜索树中的插入操作解题思路:在二叉搜索树查找的基础上,修改相关代码变差插入。450. 删除二叉搜索树中的节点解题思路:BST 的删除要比前面的三道题复杂一些。主要是被删除的节点在树中原创 2022-06-30 22:32:36 · 208 阅读 · 0 评论 -
二叉搜索树 230. 二叉搜索树中第K小的元素 1038. 从二叉搜索树到更大和树
解题思路:1038. 从二叉搜索树到更大和树解题思路:原创 2022-06-29 15:40:37 · 123 阅读 · 0 评论 -
二叉树的序列化 力扣 297. 二叉树的序列化与反序列化 652. 寻找重复的子树
解题思路:利用前文所说,分解的思路。序列化: 后序遍历拼接字符串。反序列化:由于要分割字符串的逗号,额外采用一个 helper 函数来递归地分解并拼接成树。原创 2022-06-29 10:48:40 · 1623 阅读 · 2 评论 -
力扣树的进一步应用
解题思路:105. 从前序与中序遍历序列构造二叉树解题思路:106. 从中序与后序遍历序列构造二叉树解题思路:889. 根据前序和后序遍历构造二叉树解题思路:原创 2022-06-28 16:45:42 · 1618 阅读 · 0 评论 -
二叉树类题目 力扣
226. 翻转二叉树116. 填充每个节点的下一个右侧节点指针114. 二叉树展开为链表原创 2022-06-27 23:21:23 · 128 阅读 · 0 评论 -
力扣 LeeCode 回溯类题目 括号生成,全排列,N皇后
22. 括号生成括号的匹配规则:左右括号成对,所以符合要求的括号对为 2n。接着嵌套回溯框架即可。Java解法:python 解法:46. 全排列嵌套回溯框架,尝试枚举每一个排列组合。Java 解法:python 解法:51. N 皇后皇后的放置顺序:接着嵌套回溯框架即可。C++解法:Java 解法:...原创 2022-06-07 23:41:31 · 177 阅读 · 0 评论 -
岛屿问题 (Java) LeeCode
岛屿问题200.岛屿问题1254. 统计封闭岛屿的数目695. 岛屿的最大面积1905. 统计子岛屿力扣上岛屿系列问题。200.岛屿问题解题思路:利用 DFS(深度优先搜索)根据题意计算岛屿数量。(简单易懂)DFS 是沿着任意一个单元格上,下, 左, 右 遍历的,不能斜着遍历。将计算过的岛屿淹没掉防止重复计算。class Solution { public int numIslands(char[][] grid) { int m = grid.length, n原创 2022-05-11 17:39:25 · 1252 阅读 · 0 评论 -
10. 正则表达式匹配(Java)LeeCode
解题思路:1. 如何匹配从左往右匹配,要考虑后面是否是 * 情况会多一些。但从右往左匹配,* 只影响前面的一个字符。所以我们从右往左匹配。2. 要考虑几种情况?这道题我选择了动态规划的思路,当然还有其他方法像利用自动机,本人能力有限,这里就先不提及其他方法了。对于动态规划,一般来讲我们要找到 base case 和状态转移方程。想象一下,两个 index 分别从两个字符末尾往前匹配,我们会得到一 dp 表。很多动态规划问题都是求 dp 表。dp 表的一维度长度是文本串的长度。dp 表.原创 2022-04-26 23:31:37 · 774 阅读 · 0 评论 -
剑指 Offer 09. 用两个栈实现队列 (Java) LeeCode
解题思路:利用两个栈实现队列的效果。栈1当队列尾。栈2当队列头。在队列尾部加入的时候,直接在栈1尾部加即可。删除队列头部元素的情况,需要判断一下栈1和栈2的状态;栈2为空栈2不为空,这里两种情况:栈1为空,栈1不为空。详细见下文注释class CQueue { Stack<Integer> Stack1; Stack<Integer> Stack2; public CQueue() { Stack1 = new Sta原创 2022-04-23 00:05:09 · 205 阅读 · 0 评论 -
22. 括号生成 (Java) LeeCode
解题思路:使用回溯的方式,有DFS 和 BFS。 这里只列举了前者DFS(当前字符串,左边还能使用的括号数,右边还能使用的括号数,最后结果)。只有当左右字符数量一样多的时候,括号的组合才是合法的,我们要记录的就是这种组合数有多少。class Solution { public List<String> generateParenthesis(int n) { List<String> res = new ArrayList<>();原创 2022-04-22 23:35:50 · 320 阅读 · 0 评论 -
323. 无向图中连通分量的数目(Java) LeeCode
解题思路:直接调用 这篇文章中的 Class 函数就可以。先初始化,再循环每一组连接,最后返回连通个数。990. 等式方程的可满足性class Solution { public int countComponents(int n, int[][] edges) { UF uf = new UF(n); for (int[] e : edges) { uf.union(e[0], e[1]); } .原创 2022-04-18 18:22:25 · 561 阅读 · 0 评论 -
990. 等式方程的可满足性(Java) LeeCode
解题思路:查看一组方程式里面逻辑是否相通,利用合并集可以很直观的解决这个问题。合并集:简单理解为表示两个节点直接是否连通。class Solution { //动态连通性其实就是一种等价关系,具有「自反性」「传递性」和「对称性」,其实 == 关系也是一种等价关系,具有这些性质。所以这个问题用 Union-Find 算法就很自然 public boolean equationsPossible(String[] equations) { UF uf = new UF.原创 2022-04-17 21:27:30 · 437 阅读 · 0 评论 -
53. 最大子数组和(Java) Leecode
解题思路:动态规划问题,利用dp数组。dp[ i ] 只与dp[i - 1] 有关。所以要构建dp数组,再比大小。这里有个优化方法,在构建dp数组的时候,就直接比较子数组大小。class Solution { public int maxSubArray(int[] nums) { int n = nums.length; if(n == 0) return 0; //base case int dp_0 = nums[.原创 2022-03-16 11:20:47 · 1001 阅读 · 0 评论 -
70. 爬楼梯(Java)Leecode
解题思路:爬楼梯问题就是斐波那契数列数列问题。这里利用一个dp数组储存每次递归的值,如果之后有用到直接返回。这个方法是在动态规划中很典型的,后期中等或困难的题目都是利用dp数组再优化。class Solution { int dp[]; public int climbStairs(int n) { dp = new int[n + 1]; return dp(n); } int dp(int n ).原创 2022-03-16 10:47:26 · 216 阅读 · 0 评论 -
146. LRU 缓存(Java) Leecode
解题思路:这道题主要考察缓存机制。要利用哈希链表。靠近头部的数据是最久未使用的,靠近尾部的数据是最近使用的。双链表一层存Key,与哈希表的Key做映射,另一层存Value。双链表与哈希表都存Key的原因是,在双链表中要做删除操作,要操作删除节点的前驱指针,只有双链表也存key,才能保证时间复杂度为O(1)。双链表中同时存Key 和 Value的意义是,当缓存容量满的时候,我们要删除双链表中最久未使用的Node, 此时也要把Map中映射到的Key也删除掉,这时只能通过Key的辅助来达到目的。想.原创 2022-03-16 10:31:05 · 731 阅读 · 1 评论 -
11. 盛最多水的容器(Java)Leecode
解题思路:双指针技巧,边移动边计算面积。 这道题的height[i] 是没有宽度的。不熟悉接雨水双指针的看一下这道题。接雨水问题双指针技巧class Solution { int maxArea(int[] height) { int left = 0, right = height.length - 1; int res = 0; while(left < right){ //每次移动的面积是高度最小的height[i] 和长 (right -.原创 2022-03-14 12:28:03 · 639 阅读 · 0 评论 -
42. 接雨水 (Java)Leecode
解题思路:利用双指针,左右指针同时移动,代表左右最高的柱子。每次能装的水要与最低的水位l_max或r_max比较即可。class Solution { public int trap(int[] height) { int left = 0, right = height.length - 1; int l_max = 0, r_max = 0; int res = 0; while(left < righ.原创 2022-03-14 12:09:10 · 474 阅读 · 0 评论 -
219. 存在重复元素 II (Java) Leecode
解题思路:利用HashSet 不包含重复元素的特性。class Solution { public boolean containsNearbyDuplicate(int[] nums, int k) { HashSet<Integer> set = new HashSet<>(); for(int i =0; i < nums.length; i++){ if(set.contains(nums[i])).原创 2022-03-14 11:40:38 · 644 阅读 · 0 评论 -
231. 2 的幂 | 136. 只出现一次的数字(Java) 位运算(Java) Leecode
231. 2 的幂解题思路:一个数如果是2的幂,那么它的二进制一定只含有一个1。所以,利用 n&(n-1)的位运算就能解决问题。n&(n-1)的位运算public boolean isPowerOfTwo(int n) { if (n <= 0) return false; return (n & (n - 1)) == 0; }136. 只出现一次的数字解题思路:这道题用到了异或解法:(0 ^ 任意值=任意值)原创 2022-03-13 12:17:16 · 632 阅读 · 0 评论 -
191. 位1的个数(Java) Leecode
解题思路:主要应用 n&(n-1)的位运算。对于一个二进制,从右往左,n - 1 一定可以消除最后一个 1,同时把其后的 0 都变成 1,这样再和 n 做一次 & 运算,就可以把最后一个 1 变成 0 了。public int hammingWeight(int n) { int res = 0; while(n != 0){ n = n & (n-1); res++; } .原创 2022-03-13 11:52:25 · 649 阅读 · 0 评论 -
35. 搜索插入位置(Java)leecode
解题思路:利用左侧二分查找,返回的位置就是按顺序应该插入的顺序。左侧二分查找,见第一种情况class Solution { public int searchInsert(int[] nums, int target) { if(nums.length == 0 ) return -1; int left = 0; int right = nums.length - 1; //两端都闭的情况,下面更新right和left都-1 .原创 2022-03-12 19:48:45 · 603 阅读 · 0 评论 -
797. 所有可能的路径(Java) Leecode
解题思路:这道题考察的是图的遍历,与N叉树的遍历很相似。path 是每次递归,记录路径的list,想象一下遍历树的时候,到达根节点,我们要向上遍历…, path是维护这个过程的list。res 是记录最后输出路径的list。class Solution { //记录所有路径 List<List<Integer>> res = new LinkedList<>(); public List<List<Integer&.原创 2022-03-12 18:51:51 · 613 阅读 · 0 评论 -
590. N 叉树的后序遍历(Java)Leecode
解题思路:层序遍历每次从左到右添加元素。后序遍历位置添加元素。class Solution { List<Integer> res = new LinkedList<>(); //因为每次递归都会调用res, 所以全局变量声明res public List<Integer> postorder(Node root) { traverse(root); return res;.原创 2022-03-12 15:49:06 · 690 阅读 · 0 评论 -
528. 按权重随机选择(Java) leecode
解题思路:此题为带权重的随机选择数组。如果给定一个数组怎么利用,每个元素来代表其权重呢?答案是利用前缀和数组,前缀和数组的每个元素对应的就是原数组的每个元素的权重值。假设随机生成一个target,在前缀和的两个元素之间,我们不能找到对应的前缀和值,所以就要用二分查找,寻找两个前缀和数值之间最大得元素索引,也就是向右查找。向左向右二分查找class Solution { private int[] preSum; private Random rand = new Random.原创 2022-03-10 18:31:17 · 439 阅读 · 0 评论 -
283. 移动零(Java) leecode
解题思路:把数组中的0 放到数组后面等同于移除元素0,并把原数组长度剩余的部分用0 填充。移除元素方法class Solution { public void moveZeroes(int[] nums) { int arr = removeElement(nums, 0); for(; arr < nums.length; arr++){ nums[arr] = 0; } } int rem.原创 2022-03-09 22:02:36 · 92 阅读 · 0 评论 -
27. 移除元素(java) Leecode
解题思路:双指针技巧中的快慢指针。解题思路:利用快慢指针的技巧。slow指针记录更新后数组的元素个数。class Solution { public int removeElement(int[] nums, int val) { int fast = 0, slow = 0; while (fast < nums.length) { if (nums[fast] != val) { nums[s.原创 2022-03-09 21:54:02 · 324 阅读 · 0 评论 -
83. 删除排序链表中的重复元素(Java)Leecode
解题思路:同数组的删除重复元素。26. 删除有序数组中的重复项public ListNode deleteDuplicates(ListNode head) { if(head == null) return null; ListNode slow = head, fast = head; while(fast != null){ if(fast.val != slow.val){ .原创 2022-03-09 21:30:23 · 299 阅读 · 0 评论 -
26. 删除有序数组中的重复项(Java)Leecode
解题思路:留意题目是升序数组,也就是有序的。要求原地删除,所有不能新建数组等操作。利用快慢指针的技巧。当fast指针发现不重复元素的时候,慢指针向前移动一步,并且把不重复的元素赋值给slow指针用于更新数组。public int removeDuplicates(int[] nums) { if (nums.length == 0){ return 0; } int slow = 0, fast = 0; w.原创 2022-03-09 21:29:35 · 685 阅读 · 0 评论 -
34. 在排序数组中查找元素的第一个和最后一个位置(Java) leecode
解题思路:为了找到数组中第一个元素和最后一个元素,我们分别创建两个函数来查找。首先判断函数没有找到元素的情况,以及超出查找边界的情况。对于寻找第一个元素,当找到目标值,收缩右边界继续查找,因为有重复元素存在,想象下第一个元素和第二个元素都为1的时候。寻找最后一个元素同理。.class Solution { public int[] searchRange(int[] nums, int target) { return new int[]{left_bound(nums.原创 2022-03-08 18:09:04 · 442 阅读 · 0 评论 -
704. 二分查找 (Java) Leecode
解题思路:本题为一个简单的二分查找。需要注意的点留意代码备注。class Solution { public int search(int[] nums, int target) { int left = 0; int right = nums.length - 1; while(left <= right){ // right = nums.length - 1 所有 <= int mid = left + (.原创 2022-03-08 17:36:36 · 200 阅读 · 0 评论 -
59. 螺旋矩阵 II (Java) Leecode
解题思路:与 54.螺旋矩阵相似只是换成了输入n,生成矩阵。留意题目要求输出从1开始,所有num= 1,后续 < n * nclass Solution { public int[][] generateMatrix(int n) { int[][]matrix = new int[n][n]; int upper = 0, left = 0, lower = n - 1, right = n - 1; int num = 1; whil.原创 2022-03-05 13:56:39 · 202 阅读 · 0 评论 -
54. 螺旋矩阵(Java) Leecode
解题思路:如题写出遍历循环即可,每次遍历完每个边界做相应移动,左上角为upper, 右上角为right,左下角为left, 右下角为lowerclass Solution { public List<Integer> spiralOrder(int[][] matrix) { int n = matrix[0].length, m = matrix.length; //n为第一行列数, m为行数 int upper = 0, left = 0,.原创 2022-03-05 13:40:35 · 426 阅读 · 0 评论 -
48. 旋转图像 (Java) Leecode
解题思路:顺时针旋转矩阵先沿着左对角线反转,再对每一行反转。逆时针旋转矩阵先沿着右对角线反转,再对每一行反转。此题为第一种情况。class Solution { public void rotate(int[][] matrix) { int n = matrix.length; for(int i = 0; i < n; i++){ for(int j = i; j < n; j ++){ .原创 2022-03-05 12:49:25 · 429 阅读 · 0 评论 -
438. 找到字符串中所有字母异位词(Java) Leecode
解题思路:题目要求满足条件:记录s中包含p中的相同长度的字符,不考虑顺序。与字符串的排列相同,只不过利用一个list记录起始索引。class Solution { public List<Integer> findAnagrams(String s, String p) { List<Integer> res = new ArrayList<>(); //记录结果索引 HashMap <Character, Integ.原创 2022-03-03 16:11:50 · 472 阅读 · 0 评论 -
567. 字符串的排列(Java) Leecode
解题思路:要求:判断中包含s1中的字符,且字符数量与s1中的一样。与最小覆盖子串不同的是滑动窗口左下标移动的判断条件。如果一样的话相等或者大于的话就要移动,因为要求与s1中的字符长度相同。class Solution { public boolean checkInclusion(String s1, String s2) { HashMap <Character, Integer> need = new HashMap<>(); // 记录需要s1.原创 2022-03-03 16:01:08 · 250 阅读 · 0 评论