From 9ba2e0d7bcef19b13f2d75a5c3c171dbdf0187a9 Mon Sep 17 00:00:00 2001 From: tianbin Date: Sun, 30 Oct 2022 23:47:37 +0800 Subject: [PATCH] =?UTF-8?q?feat=20=E4=BA=8C=E5=8F=89=E6=A0=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 6 + ...\345\205\245\344\275\215\347\275\256.java" | 2 +- ...\345\271\263\346\226\271\346\240\271.java" | 6 +- ...\345\244\215\345\205\203\347\264\240.java" | 4 +- .../H051_N\347\232\207\345\220\216.java" | 10 +- ...\345\205\245\345\214\272\351\227\264.java" | 8 +- ...\350\276\221\350\267\235\347\246\273.java" | 8 +- ...\347\232\204\345\256\271\345\231\250.java" | 4 +- ...\346\225\260\344\271\213\345\222\214.java" | 2 +- ...\346\225\260\344\271\213\345\222\214.java" | 2 +- ...\344\270\252\350\212\202\347\202\271.java" | 4 +- ...\345\272\217\346\225\260\347\273\204.java" | 8 +- ...\344\270\252\344\275\215\347\275\256.java" | 6 +- ...\345\220\210\346\200\273\345\222\214.java" | 20 +- ...345\220\210\346\200\273\345\222\2142.java" | 18 +- ...\345\271\266\345\214\272\351\227\264.java" | 2 +- ...\344\270\252\346\216\222\345\210\227.java" | 14 +- ...\350\275\254\351\223\276\350\241\250.java" | 10 +- ...\345\220\214\350\267\257\345\276\204.java" | 8 +- ...345\220\214\350\267\257\345\276\2042.java" | 10 +- ...\347\273\264\347\237\251\351\230\265.java" | 6 +- ...350\275\254\351\223\276\350\241\2502.java" | 2 +- ...\345\272\217\351\201\215\345\216\206.java" | 2 +- ...\347\232\204\346\225\260\351\207\217.java" | 2 +- ...\346\220\234\347\264\242\346\240\221.java" | 10 +- ...\344\272\214\345\217\211\346\240\221.java" | 4 +- ...\345\244\247\346\267\261\345\272\246.java" | 4 +- ...\344\272\214\345\217\211\346\240\221.java" | 4 +- ...\345\260\217\346\267\261\345\272\246.java" | 2 +- ...\344\275\263\346\227\266\346\234\272.java" | 4 +- ...344\275\263\346\227\266\346\234\2722.java" | 12 +- ...\345\256\266\345\212\253\350\210\215.java" | 8 +- ...344\275\263\346\227\266\346\234\2723.java" | 14 +- ...\350\267\257\345\276\204\345\222\214.java" | 14 +- ...\347\273\255\345\272\217\345\210\227.java" | 4 +- ...350\257\215\346\213\206\345\210\2062.java" | 12 +- ...\345\244\247\351\227\264\350\267\235.java" | 4 +- ...344\275\263\346\227\266\346\234\2724.java" | 6 +- ...\346\254\241\351\201\215\345\216\206.java" | 2 +- ...\350\257\215\346\216\245\351\276\231.java" | 8 +- ...\345\212\240\346\262\271\347\253\231.java" | 8 +- ...\350\257\215\346\213\206\345\210\206.java" | 4 +- ...\345\272\217\351\201\215\345\216\206.java" | 2 +- ...\345\272\217\351\201\215\345\216\206.java" | 2 +- ...\345\255\230\346\234\272\345\210\266.java" | 4 +- ...\345\205\245\346\216\222\345\272\217.java" | 6 +- ...\345\272\217\351\223\276\350\241\250.java" | 6 +- ...\346\234\200\345\260\217\345\200\274.java" | 2 +- ...\345\215\225\345\205\203\346\240\274.java" | 6 +- ...\345\205\254\345\233\240\345\255\220.java" | 8 +- ...\345\257\271\346\216\222\345\272\217.java" | 16 +- ...\345\206\231\345\215\225\350\257\215.java" | 12 +- ...\347\232\204\347\273\223\347\202\271.java" | 6 +- ...\345\274\202\344\275\215\350\257\215.java" | 2 +- ...\345\272\217\345\210\227\345\214\226.java" | 6 +- ...\350\257\276\347\250\213\350\241\250.java" | 14 +- ...350\257\276\347\250\213\350\241\2502.java" | 16 +- ...345\256\266\345\212\253\350\210\2152.java" | 8 +- ...\345\244\247\345\205\203\347\264\240.java" | 2 +- ...345\220\210\346\200\273\345\222\2143.java" | 4 +- ...\347\202\271\344\270\252\346\225\260.java" | 2 +- ...\345\242\236\350\267\257\345\276\204.java" | 4 +- ...\345\255\220\345\272\217\345\210\227.java" | 6 +- ...\345\206\267\345\206\273\346\234\237.java" | 2 +- ...\351\222\261\345\205\221\346\215\242.java" | 8 +- ...345\256\266\345\212\253\350\210\2153.java" | 6 +- ...\345\243\266\351\227\256\351\242\230.java" | 4 +- ...345\244\247\345\205\203\347\264\2401.java" | 12 +- .../H460_LFU\347\274\223\345\255\230.java" | 8 +- ...\344\275\215\346\225\260\345\255\227.java" | 4 +- ...\345\273\272\351\230\237\345\210\227.java" | 2 +- ...\345\222\214\345\255\220\351\233\206.java" | 4 +- ...\347\210\206\346\260\224\347\220\203.java" | 8 +- ...\344\270\200\345\222\214\351\233\266.java" | 6 +- ...\347\233\256\346\240\207\345\222\214.java" | 2 +- ...\347\224\261\344\271\213\350\267\257.java" | 18 +- ...\345\255\220\345\272\217\345\210\227.java" | 4 +- ...351\222\261\345\205\221\346\215\2422.java" | 4 +- ...\346\234\213\345\217\213\345\234\210.java" | 4 +- ...\345\244\247\351\235\242\347\247\257.java" | 8 +- ...\345\210\206\346\237\245\346\211\276.java" | 12 +- ...\346\211\213\347\273\255\350\264\271.java" | 6 +- ...\351\227\264\347\273\223\347\202\271.java" | 10 +- ...\350\233\213\346\216\211\350\220\275.java" | 10 +- ...\345\272\217\346\225\260\347\273\204.java" | 6 +- ...345\272\217\346\225\260\347\273\2042.java" | 8 +- ...345\220\214\350\267\257\345\276\2043.java" | 4 +- ...\345\272\217\346\225\260\347\273\204.java" | 6 +- ...\345\260\217\345\242\236\351\207\217.java" | 4 +- ...347\232\204K\344\270\252\347\202\271.java" | 4 +- src/main/java/common/datastruct/TreeNode.java | 4 + src/main/java/common/util/CompareUtils.java | 51 ++++- .../java/common/util/ConstructBinaryTree.java | 51 ++++- .../java/common/util/PrintBinaryTree.java | 31 ++- ...00\347\232\204\347\256\227\346\263\225.md" | 0 .../Code07_FindFirstIntersectListNode.java" | 38 ++++ .../Code01_RecursiveTraversalBT.java" | 111 ++++++++++ .../Code02_UnRecursiveTraversalBT.java" | 117 +++++++++++ .../Code03_LevelTraversalBT.java" | 67 ++++++ .../Code04_SerializeAndReconstructTree.java" | 24 +++ ...de04_SerializeAndReconstructTreeImpl.java" | 192 ++++++++++++++++++ .../Code05_EncodeNaryTreeToBinaryTree.java" | 19 ++ .../Code06_TreeMaxWidth.java" | 85 ++++++++ .../Code01_IsBalanced.java" | 85 ++++++++ .../Code02_IsBST.java" | 110 ++++++++++ .../Code03_MaxDistance.java" | 131 ++++++++++++ .../Code04_IsFull.java" | 95 +++++++++ .../Code05_MaxSubBSTSize.java" | 87 ++++++++ .../Code06_IsCBT.java" | 90 ++++++++ .../Code07_MaxSubBSTHead.java" | 91 +++++++++ .../Code08_lowestAncestor.java" | 93 +++++++++ .../Code09_MaxHappy.java" | 110 ++++++++++ .../c02xx_summary.md" | 5 - ...76\350\241\250\345\222\214\346\240\221.md" | 36 ++++ 114 files changed, 1996 insertions(+), 323 deletions(-) rename "src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c01xx_summary.md" => "src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c01xx_\344\270\200\344\272\233\350\266\205\347\272\247\345\237\272\347\241\200\347\232\204\347\256\227\346\263\225.md" (100%) create mode 100644 "src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0203_\346\240\221/Code01_RecursiveTraversalBT.java" create mode 100644 "src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0203_\346\240\221/Code02_UnRecursiveTraversalBT.java" create mode 100644 "src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0203_\346\240\221/Code03_LevelTraversalBT.java" create mode 100644 "src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0203_\346\240\221/Code04_SerializeAndReconstructTree.java" create mode 100644 "src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0203_\346\240\221/Code04_SerializeAndReconstructTreeImpl.java" create mode 100644 "src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0203_\346\240\221/Code05_EncodeNaryTreeToBinaryTree.java" create mode 100644 "src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0203_\346\240\221/Code06_TreeMaxWidth.java" create mode 100644 "src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0204_\346\240\221\345\236\213DP/Code01_IsBalanced.java" create mode 100644 "src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0204_\346\240\221\345\236\213DP/Code02_IsBST.java" create mode 100644 "src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0204_\346\240\221\345\236\213DP/Code03_MaxDistance.java" create mode 100644 "src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0204_\346\240\221\345\236\213DP/Code04_IsFull.java" create mode 100644 "src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0204_\346\240\221\345\236\213DP/Code05_MaxSubBSTSize.java" create mode 100644 "src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0204_\346\240\221\345\236\213DP/Code06_IsCBT.java" create mode 100644 "src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0204_\346\240\221\345\236\213DP/Code07_MaxSubBSTHead.java" create mode 100644 "src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0204_\346\240\221\345\236\213DP/Code08_lowestAncestor.java" create mode 100644 "src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0204_\346\240\221\345\236\213DP/Code09_MaxHappy.java" delete mode 100644 "src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c02xx_summary.md" create mode 100644 "src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c02xx_\351\223\276\350\241\250\345\222\214\346\240\221.md" diff --git a/pom.xml b/pom.xml index 303a5a6d..41df4132 100644 --- a/pom.xml +++ b/pom.xml @@ -22,6 +22,12 @@ 1.0-SNAPSHOT + + org.skyscreamer + jsonassert + 1.5.1 + + cglib diff --git "a/src/main/java/algorithm_practice/LeetCode/code000/E035_\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.java" "b/src/main/java/algorithm_practice/LeetCode/code000/E035_\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.java" index 8a60fa75..a7622598 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code000/E035_\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code000/E035_\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256.java" @@ -12,7 +12,7 @@ 输入: [1,3,5,6], 5 输出: 2 -示例 2: +示例 2: 输入: [1,3,5,6], 2 输出: 1 diff --git "a/src/main/java/algorithm_practice/LeetCode/code000/E069_x\347\232\204\345\271\263\346\226\271\346\240\271.java" "b/src/main/java/algorithm_practice/LeetCode/code000/E069_x\347\232\204\345\271\263\346\226\271\346\240\271.java" index f0404d3f..194a6eca 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code000/E069_x\347\232\204\345\271\263\346\226\271\346\240\271.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code000/E069_x\347\232\204\345\271\263\346\226\271\346\240\271.java" @@ -4,9 +4,9 @@ import org.junit.Test; /* -实现 int sqrt(int x) 函数。 +实现 int sqrt(int x) 函数。 -计算并返回 x 的平方根,其中 x 是非负整数。 +计算并返回 x 的平方根,其中 x 是非负整数。 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。 @@ -18,7 +18,7 @@ 输入: 8 输出: 2 说明: 8 的平方根是 2.82842..., -  由于返回类型是整数,小数部分将被舍去。 + 由于返回类型是整数,小数部分将被舍去。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/sqrtx diff --git "a/src/main/java/algorithm_practice/LeetCode/code000/E083_\345\210\240\351\231\244\346\216\222\345\272\217\351\223\276\350\241\250\344\270\255\347\232\204\351\207\215\345\244\215\345\205\203\347\264\240.java" "b/src/main/java/algorithm_practice/LeetCode/code000/E083_\345\210\240\351\231\244\346\216\222\345\272\217\351\223\276\350\241\250\344\270\255\347\232\204\351\207\215\345\244\215\345\205\203\347\264\240.java" index ed2571cd..ec9f8063 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code000/E083_\345\210\240\351\231\244\346\216\222\345\272\217\351\223\276\350\241\250\344\270\255\347\232\204\351\207\215\345\244\215\345\205\203\347\264\240.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code000/E083_\345\210\240\351\231\244\346\216\222\345\272\217\351\223\276\350\241\250\344\270\255\347\232\204\351\207\215\345\244\215\345\205\203\347\264\240.java" @@ -9,11 +9,11 @@ /* 给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。 -示例 1: +示例 1: 输入: 1->1->2 输出: 1->2 -示例 2: +示例 2: 输入: 1->1->2->3->3 输出: 1->2->3 diff --git "a/src/main/java/algorithm_practice/LeetCode/code000/H051_N\347\232\207\345\220\216.java" "b/src/main/java/algorithm_practice/LeetCode/code000/H051_N\347\232\207\345\220\216.java" index 92e99775..1c17fd4e 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code000/H051_N\347\232\207\345\220\216.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code000/H051_N\347\232\207\345\220\216.java" @@ -9,7 +9,7 @@ import java.util.List; /* -n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。 +n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。 [".Q..", "...Q", @@ -18,11 +18,11 @@ 上图为 8 皇后问题的一种解法。 -给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。 +给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。 -每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。 +每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。 -  + 示例: @@ -39,7 +39,7 @@ ".Q.."] ] 解释: 4 皇后问题存在两个不同的解法。 -  + 提示: diff --git "a/src/main/java/algorithm_practice/LeetCode/code000/H057_\346\217\222\345\205\245\345\214\272\351\227\264.java" "b/src/main/java/algorithm_practice/LeetCode/code000/H057_\346\217\222\345\205\245\345\214\272\351\227\264.java" index 79e962dc..fd220e8d 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code000/H057_\346\217\222\345\205\245\345\214\272\351\227\264.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code000/H057_\346\217\222\345\205\245\345\214\272\351\227\264.java" @@ -11,17 +11,17 @@ 在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。 -  + -示例 1: +示例 1: 输入:intervals = [[1,3],[6,9]], newInterval = [2,5] 输出:[[1,5],[6,9]] -示例 2: +示例 2: 输入:intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8] 输出:[[1,2],[3,10],[12,16]] -解释:这是因为新的区间 [4,8] 与 [3,5],[6,7],[8,10] 重叠。 +解释:这是因为新的区间 [4,8] 与 [3,5],[6,7],[8,10] 重叠。 来源:力扣(LeetCode) diff --git "a/src/main/java/algorithm_practice/LeetCode/code000/H072_\347\274\226\350\276\221\350\267\235\347\246\273.java" "b/src/main/java/algorithm_practice/LeetCode/code000/H072_\347\274\226\350\276\221\350\267\235\347\246\273.java" index 1e0e6ff4..e09421ac 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code000/H072_\347\274\226\350\276\221\350\267\235\347\246\273.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code000/H072_\347\274\226\350\276\221\350\267\235\347\246\273.java" @@ -4,16 +4,16 @@ import org.junit.Test; /* -给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。 +给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作: 插入一个字符 删除一个字符 替换一个字符 -  + -示例 1: +示例 1: 输入:word1 = "horse", word2 = "ros" 输出:3 @@ -21,7 +21,7 @@ horse -> rorse (将 'h' 替换为 'r') rorse -> rose (删除 'r') rose -> ros (删除 'e') -示例 2: +示例 2: 输入:word1 = "intention", word2 = "execution" 输出:5 diff --git "a/src/main/java/algorithm_practice/LeetCode/code000/M011_\347\233\233\346\234\200\345\244\232\346\260\264\347\232\204\345\256\271\345\231\250.java" "b/src/main/java/algorithm_practice/LeetCode/code000/M011_\347\233\233\346\234\200\345\244\232\346\260\264\347\232\204\345\256\271\345\231\250.java" index 6d4f819f..311cead3 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code000/M011_\347\233\233\346\234\200\345\244\232\346\260\264\347\232\204\345\256\271\345\231\250.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code000/M011_\347\233\233\346\234\200\345\244\232\346\260\264\347\232\204\345\256\271\345\231\250.java" @@ -4,8 +4,8 @@ import org.junit.Test; /* -给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 -说明:你不能倾斜容器,且 n 的值至少为 2。 +给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 +说明:你不能倾斜容器,且 n 的值至少为 2。 示例: 输入: [1,8,6,2,5,4,8,3,7] diff --git "a/src/main/java/algorithm_practice/LeetCode/code000/M015_\344\270\211\346\225\260\344\271\213\345\222\214.java" "b/src/main/java/algorithm_practice/LeetCode/code000/M015_\344\270\211\346\225\260\344\271\213\345\222\214.java" index c2484e09..16797958 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code000/M015_\344\270\211\346\225\260\344\271\213\345\222\214.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code000/M015_\344\270\211\346\225\260\344\271\213\345\222\214.java" @@ -10,7 +10,7 @@ import java.util.List; /* -给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。 +给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。 注意:答案中不可以包含重复的三元组。 diff --git "a/src/main/java/algorithm_practice/LeetCode/code000/M016_\346\234\200\346\216\245\350\277\221\347\232\204\344\270\211\346\225\260\344\271\213\345\222\214.java" "b/src/main/java/algorithm_practice/LeetCode/code000/M016_\346\234\200\346\216\245\350\277\221\347\232\204\344\270\211\346\225\260\344\271\213\345\222\214.java" index 2ee6c094..97aa6e0e 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code000/M016_\346\234\200\346\216\245\350\277\221\347\232\204\344\270\211\346\225\260\344\271\213\345\222\214.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code000/M016_\346\234\200\346\216\245\350\277\221\347\232\204\344\270\211\346\225\260\344\271\213\345\222\214.java" @@ -6,7 +6,7 @@ import java.util.Arrays; /* -给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。 +给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。 例如,给定数组 nums = [-1,2,1,-4], 和 target = 1. 与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2). diff --git "a/src/main/java/algorithm_practice/LeetCode/code000/M019_\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.java" "b/src/main/java/algorithm_practice/LeetCode/code000/M019_\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.java" index 3d5ec103..5e1190c2 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code000/M019_\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code000/M019_\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254N\344\270\252\350\212\202\347\202\271.java" @@ -7,7 +7,7 @@ import org.junit.Test; /* -给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。 +给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. @@ -15,7 +15,7 @@ 当删除了倒数第二个节点后,链表变为 1->2->3->5. 说明: -给定的 n 保证是有效的。 +给定的 n 保证是有效的。 进阶: 你能尝试使用一趟扫描实现吗? diff --git "a/src/main/java/algorithm_practice/LeetCode/code000/M033_\346\220\234\347\264\242\346\227\213\350\275\254\346\216\222\345\272\217\346\225\260\347\273\204.java" "b/src/main/java/algorithm_practice/LeetCode/code000/M033_\346\220\234\347\264\242\346\227\213\350\275\254\346\216\222\345\272\217\346\225\260\347\273\204.java" index d6fd08c0..ac978125 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code000/M033_\346\220\234\347\264\242\346\227\213\350\275\254\346\216\222\345\272\217\346\225\260\347\273\204.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code000/M033_\346\220\234\347\264\242\346\227\213\350\275\254\346\216\222\345\272\217\346\225\260\347\273\204.java" @@ -7,19 +7,19 @@ /* 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 -( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。 +( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。 -搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。 +搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。 你可以假设数组中不存在重复的元素。 -你的算法时间复杂度必须是 O(log n) 级别。 +你的算法时间复杂度必须是 O(log n) 级别。 示例 1: 输入: nums = [4,5,6,7,0,1,2], target = 0 输出: 4 -示例 2: +示例 2: 输入: nums = [4,5,6,7,0,1,2], target = 3 输出: -1 diff --git "a/src/main/java/algorithm_practice/LeetCode/code000/M034_\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.java" "b/src/main/java/algorithm_practice/LeetCode/code000/M034_\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.java" index 503cc43e..935c7ed7 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code000/M034_\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code000/M034_\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256.java" @@ -6,14 +6,14 @@ /* 给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。 -你的算法时间复杂度必须是 O(log n) 级别。 -如果数组中不存在目标值,返回 [-1, -1]。 +你的算法时间复杂度必须是 O(log n) 级别。 +如果数组中不存在目标值,返回 [-1, -1]。 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: [3,4] -示例 2: +示例 2: 输入: nums = [5,7,7,8,8,10], target = 6 输出: [-1,-1] diff --git "a/src/main/java/algorithm_practice/LeetCode/code000/M039_\347\273\204\345\220\210\346\200\273\345\222\214.java" "b/src/main/java/algorithm_practice/LeetCode/code000/M039_\347\273\204\345\220\210\346\200\273\345\222\214.java" index 1e90ce3d..b602648a 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code000/M039_\347\273\204\345\220\210\346\200\273\345\222\214.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code000/M039_\347\273\204\345\220\210\346\200\273\345\222\214.java" @@ -7,15 +7,15 @@ import java.util.*; /* -给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 +给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 -candidates 中的数字可以无限制重复被选取。 +candidates 中的数字可以无限制重复被选取。 说明: -所有数字(包括 target)都是正整数。 -解集不能包含重复的组合。  -示例 1: +所有数字(包括 target)都是正整数。 +解集不能包含重复的组合。 +示例 1: 输入:candidates = [2,3,6,7], target = 7, 所求解集为: @@ -23,16 +23,16 @@ [7], [2,2,3] ] -示例 2: +示例 2: 输入:candidates = [2,3,5], target = 8, 所求解集为: [ -  [2,2,2,2], -  [2,3,3], -  [3,5] + [2,2,2,2], + [2,3,3], + [3,5] ] -  + 提示: diff --git "a/src/main/java/algorithm_practice/LeetCode/code000/M040_\347\273\204\345\220\210\346\200\273\345\222\2142.java" "b/src/main/java/algorithm_practice/LeetCode/code000/M040_\347\273\204\345\220\210\346\200\273\345\222\2142.java" index dc18d8c6..33d99ef1 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code000/M040_\347\273\204\345\220\210\346\200\273\345\222\2142.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code000/M040_\347\273\204\345\220\210\346\200\273\345\222\2142.java" @@ -8,17 +8,17 @@ import java.util.stream.Collectors; /* -给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 +给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 -candidates 中的每个数字在每个组合中只能使用一次。 +candidates 中的每个数字在每个组合中只能使用一次。 说明: 所有数字(包括目标数)都是正整数。 -解集不能包含重复的组合。  -示例 1: +解集不能包含重复的组合。 +示例 1: -输入: candidates = [10,1,2,7,6,1,5], target = 8, +输入: candidates = [10,1,2,7,6,1,5], target = 8, 所求解集为: [ [1, 7], @@ -26,13 +26,13 @@ [2, 6], [1, 1, 6] ] -示例 2: +示例 2: -输入: candidates = [2,5,2,1,2], target = 5, +输入: candidates = [2,5,2,1,2], target = 5, 所求解集为: [ -  [1,2,2], -  [5] + [1,2,2], + [5] ] diff --git "a/src/main/java/algorithm_practice/LeetCode/code000/M056_\345\220\210\345\271\266\345\214\272\351\227\264.java" "b/src/main/java/algorithm_practice/LeetCode/code000/M056_\345\220\210\345\271\266\345\214\272\351\227\264.java" index d9c455a4..30bc5150 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code000/M056_\345\220\210\345\271\266\345\214\272\351\227\264.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code000/M056_\345\220\210\345\271\266\345\214\272\351\227\264.java" @@ -14,7 +14,7 @@ 输出: [[1,6],[8,10],[15,18]] 解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6]. -示例 2: +示例 2: 输入: [[1,4],[4,5]] 输出: [[1,5]] 解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。 diff --git "a/src/main/java/algorithm_practice/LeetCode/code000/M060_\347\254\254k\344\270\252\346\216\222\345\210\227.java" "b/src/main/java/algorithm_practice/LeetCode/code000/M060_\347\254\254k\344\270\252\346\216\222\345\210\227.java" index 743b55f2..48d7d414 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code000/M060_\347\254\254k\344\270\252\346\216\222\345\210\227.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code000/M060_\347\254\254k\344\270\252\346\216\222\345\210\227.java" @@ -5,9 +5,9 @@ import org.junit.Test; /* -给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。 +给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。 -按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下: +按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下: "123" "132" @@ -15,17 +15,17 @@ "231" "312" "321" -给定 n 和 k,返回第 k 个排列。 +给定 n 和 k,返回第 k 个排列。 说明: -给定 n 的范围是 [1, 9]。 -给定 k 的范围是[1,  n!]。 -示例 1: +给定 n 的范围是 [1, 9]。 +给定 k 的范围是[1, n!]。 +示例 1: 输入: n = 3, k = 3 输出: "213" -示例 2: +示例 2: 输入: n = 4, k = 9 输出: "2314" diff --git "a/src/main/java/algorithm_practice/LeetCode/code000/M061_\346\227\213\350\275\254\351\223\276\350\241\250.java" "b/src/main/java/algorithm_practice/LeetCode/code000/M061_\346\227\213\350\275\254\351\223\276\350\241\250.java" index 1f6b85f0..e0205500 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code000/M061_\346\227\213\350\275\254\351\223\276\350\241\250.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code000/M061_\346\227\213\350\275\254\351\223\276\350\241\250.java" @@ -7,23 +7,23 @@ import org.junit.Test; /* -给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。 +给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。 -示例 1: +示例 1: 输入: 1->2->3->4->5->NULL, k = 2 输出: 4->5->1->2->3->NULL 解释: 向右旋转 1 步: 5->1->2->3->4->NULL 向右旋转 2 步: 4->5->1->2->3->NULL -示例 2: +示例 2: 输入: 0->1->2->NULL, k = 4 输出: 2->0->1->NULL 解释: 向右旋转 1 步: 2->0->1->NULL 向右旋转 2 步: 1->2->0->NULL -向右旋转 3 步: 0->1->2->NULL -向右旋转 4 步: 2->0->1->NULL +向右旋转 3 步: 0->1->2->NULL +向右旋转 4 步: 2->0->1->NULL 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/rotate-list diff --git "a/src/main/java/algorithm_practice/LeetCode/code000/M062_\344\270\215\345\220\214\350\267\257\345\276\204.java" "b/src/main/java/algorithm_practice/LeetCode/code000/M062_\344\270\215\345\220\214\350\267\257\345\276\204.java" index 109adc31..80ab4f30 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code000/M062_\344\270\215\345\220\214\350\267\257\345\276\204.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code000/M062_\344\270\215\345\220\214\350\267\257\345\276\204.java" @@ -14,9 +14,9 @@ 例如,上图是一个7 x 3 的网格。有多少可能的路径? -  + -示例 1: +示例 1: 输入: m = 3, n = 2 输出: 3 @@ -25,11 +25,11 @@ 1. 向右 -> 向右 -> 向下 2. 向右 -> 向下 -> 向右 3. 向下 -> 向右 -> 向右 -示例 2: +示例 2: 输入: m = 7, n = 3 输出: 28 -  + 提示: diff --git "a/src/main/java/algorithm_practice/LeetCode/code000/M063_\344\270\215\345\220\214\350\267\257\345\276\2042.java" "b/src/main/java/algorithm_practice/LeetCode/code000/M063_\344\270\215\345\220\214\350\267\257\345\276\2042.java" index 4a693364..2e71e1de 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code000/M063_\344\270\215\345\220\214\350\267\257\345\276\2042.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code000/M063_\344\270\215\345\220\214\350\267\257\345\276\2042.java" @@ -14,15 +14,15 @@ 网格中的障碍物和空位置分别用 1 和 0 来表示。 -说明:m 和 n 的值均不超过 100。 +说明:m 和 n 的值均不超过 100。 -示例 1: +示例 1: 输入: [ -  [0,0,0], -  [0,1,0], -  [0,0,0] + [0,0,0], + [0,1,0], + [0,0,0] ] 输出: 2 解释: diff --git "a/src/main/java/algorithm_practice/LeetCode/code000/M074_\346\220\234\347\264\242\344\272\214\347\273\264\347\237\251\351\230\265.java" "b/src/main/java/algorithm_practice/LeetCode/code000/M074_\346\220\234\347\264\242\344\272\214\347\273\264\347\237\251\351\230\265.java" index 6b154797..6bc9cdb2 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code000/M074_\346\220\234\347\264\242\344\272\214\347\273\264\347\237\251\351\230\265.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code000/M074_\346\220\234\347\264\242\344\272\214\347\273\264\347\237\251\351\230\265.java" @@ -4,11 +4,11 @@ import org.junit.Test; /* -编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性: +编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性: 每行中的整数从左到右按升序排列。 每行的第一个整数大于前一行的最后一个整数。 -示例 1: +示例 1: 输入: matrix = [ [1, 3, 5, 7], @@ -18,7 +18,7 @@ target = 3 输出: true -示例 2: +示例 2: 输入: matrix = [ [1, 3, 5, 7], diff --git "a/src/main/java/algorithm_practice/LeetCode/code000/M092_\345\217\215\350\275\254\351\223\276\350\241\2502.java" "b/src/main/java/algorithm_practice/LeetCode/code000/M092_\345\217\215\350\275\254\351\223\276\350\241\2502.java" index 8c6c5db0..afecd71c 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code000/M092_\345\217\215\350\275\254\351\223\276\350\241\2502.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code000/M092_\345\217\215\350\275\254\351\223\276\350\241\2502.java" @@ -11,7 +11,7 @@ 反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。 说明: - 1 ≤ m ≤ n ≤ 链表长度。 + 1 ≤ m ≤ n ≤ 链表长度。 示例: diff --git "a/src/main/java/algorithm_practice/LeetCode/code000/M094_\344\272\214\345\217\211\346\240\221\347\232\204\344\270\255\345\272\217\351\201\215\345\216\206.java" "b/src/main/java/algorithm_practice/LeetCode/code000/M094_\344\272\214\345\217\211\346\240\221\347\232\204\344\270\255\345\272\217\351\201\215\345\216\206.java" index daa50517..93077f2c 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code000/M094_\344\272\214\345\217\211\346\240\221\347\232\204\344\270\255\345\272\217\351\201\215\345\216\206.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code000/M094_\344\272\214\345\217\211\346\240\221\347\232\204\344\270\255\345\272\217\351\201\215\345\216\206.java" @@ -23,7 +23,7 @@ 输出: [1,3,2] -进阶: 递归算法很简单,你可以通过迭代算法完成吗? +进阶: 递归算法很简单,你可以通过迭代算法完成吗? 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/binary-tree-inorder-traversal diff --git "a/src/main/java/algorithm_practice/LeetCode/code000/M096_\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\225\260\351\207\217.java" "b/src/main/java/algorithm_practice/LeetCode/code000/M096_\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\225\260\351\207\217.java" index 9f9d96d0..013f6d0e 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code000/M096_\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\225\260\351\207\217.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code000/M096_\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\346\225\260\351\207\217.java" @@ -4,7 +4,7 @@ import org.junit.Test; /* -给定一个整数 n,求以 1 ... n 为结点组成的二叉搜索树有多少种? +给定一个整数 n,求以 1 ... n 为结点组成的二叉搜索树有多少种? 示例: diff --git "a/src/main/java/algorithm_practice/LeetCode/code000/M098_\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.java" "b/src/main/java/algorithm_practice/LeetCode/code000/M098_\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.java" index 09b833be..c0ddee46 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code000/M098_\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code000/M098_\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221.java" @@ -15,24 +15,24 @@ 结点的左子树只包含小于当前结点的数。 结点的右子树只包含大于当前结点的数。 所有左子树和右子树自身必须也是二叉搜索树。 -示例 1: +示例 1: 输入: 2 / \ 1 3 输出: true -示例 2: +示例 2: 输入: 5 / \ 1 4 -  / \ -  3 6 + / \ + 3 6 输出: false 解释: 输入为: [5,1,4,null,null,3,6]。 -  根结点的值为 5 ,但是其右子结点值为 4 。 + 根结点的值为 5 ,但是其右子结点值为 4 。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/validate-binary-search-tree diff --git "a/src/main/java/algorithm_practice/LeetCode/code100/E101_\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.java" "b/src/main/java/algorithm_practice/LeetCode/code100/E101_\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.java" index 46b0c468..260cd89d 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code100/E101_\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code100/E101_\345\257\271\347\247\260\344\272\214\345\217\211\346\240\221.java" @@ -8,7 +8,7 @@ /* 给定一个二叉树,检查它是否是镜像对称的。 - 例如,二叉树 [1,2,2,3,4,4,3] 是对称的。 + 例如,二叉树 [1,2,2,3,4,4,3] 是对称的。 1 / \ @@ -16,7 +16,7 @@ / \ / \ 3 4 4 3 - 但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的: + 但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的: 1 / \ 2 2 diff --git "a/src/main/java/algorithm_practice/LeetCode/code100/E104_\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.java" "b/src/main/java/algorithm_practice/LeetCode/code100/E104_\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.java" index 32f708af..405f9fdc 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code100/E104_\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code100/E104_\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\244\247\346\267\261\345\272\246.java" @@ -13,7 +13,7 @@ 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 -说明: 叶子节点是指没有子节点的节点。 +说明: 叶子节点是指没有子节点的节点。 示例: 给定二叉树 [3,9,20,null,null,15,7], @@ -23,7 +23,7 @@ 9 20 / \ 15 7 -返回它的最大深度 3 。 +返回它的最大深度 3 。 diff --git "a/src/main/java/algorithm_practice/LeetCode/code100/E110_\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.java" "b/src/main/java/algorithm_practice/LeetCode/code100/E110_\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.java" index 849963dc..0ab61ff0 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code100/E110_\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code100/E110_\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.java" @@ -8,7 +8,7 @@ /* 给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为: - 一个二叉树每个结点 的左右两个子树的高度差的绝对值不超过1。 + 一个二叉树每个结点 的左右两个子树的高度差的绝对值不超过1。 示例 1: 给定二叉树 [3,9,20,null,null,15,7] @@ -28,7 +28,7 @@ 3 3 / \ 4 4 -返回 false 。 +返回 false 。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/balanced-binary-tree diff --git "a/src/main/java/algorithm_practice/LeetCode/code100/E111_\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.java" "b/src/main/java/algorithm_practice/LeetCode/code100/E111_\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.java" index 6a10a560..7af7244c 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code100/E111_\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code100/E111_\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\345\260\217\346\267\261\345\272\246.java" @@ -31,7 +31,7 @@ 输入:root = [2,null,3,null,4,null,5,null,6] 输出:5 -  + 提示: diff --git "a/src/main/java/algorithm_practice/LeetCode/code100/E121_\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.java" "b/src/main/java/algorithm_practice/LeetCode/code100/E121_\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.java" index 0737512d..8d88b218 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code100/E121_\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code100/E121_\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272.java" @@ -4,13 +4,13 @@ import org.junit.Test; /* -给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 +给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。 注意:你不能在买入股票前卖出股票。 -  + 示例 1: diff --git "a/src/main/java/algorithm_practice/LeetCode/code100/E122_\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\2722.java" "b/src/main/java/algorithm_practice/LeetCode/code100/E122_\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\2722.java" index c309a41d..1453ea84 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code100/E122_\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\2722.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code100/E122_\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\2722.java" @@ -4,28 +4,28 @@ import org.junit.Test; /* -给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 +给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。 -  + 示例 1: 输入: [7,1,5,3,6,4] 输出: 7 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。 -  随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。 + 随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。 示例 2: 输入: [1,2,3,4,5] 输出: 4 解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。 -  注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。 -  因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。 -示例 3: + 注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。 + 因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。 +示例 3: 输入: [7,6,4,3,1] 输出: 0 diff --git "a/src/main/java/algorithm_practice/LeetCode/code100/E198_\346\211\223\345\256\266\345\212\253\350\210\215.java" "b/src/main/java/algorithm_practice/LeetCode/code100/E198_\346\211\223\345\256\266\345\212\253\350\210\215.java" index 446a38f9..c32b59ef 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code100/E198_\346\211\223\345\256\266\345\212\253\350\210\215.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code100/E198_\346\211\223\345\256\266\345\212\253\350\210\215.java" @@ -8,21 +8,21 @@ 给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。 -  + 示例 1: 输入:[1,2,3,1] 输出:4 解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。 -  偷窃到的最高金额 = 1 + 3 = 4 。 + 偷窃到的最高金额 = 1 + 3 = 4 。 示例 2: 输入:[2,7,9,3,1] 输出:12 解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。 -  偷窃到的最高金额 = 2 + 9 + 1 = 12 。 -  + 偷窃到的最高金额 = 2 + 9 + 1 = 12 。 + 提示: diff --git "a/src/main/java/algorithm_practice/LeetCode/code100/H123_\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\2723.java" "b/src/main/java/algorithm_practice/LeetCode/code100/H123_\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\2723.java" index 7b07458e..2810b18f 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code100/H123_\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\2723.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code100/H123_\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\2723.java" @@ -6,23 +6,23 @@ /* 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。 -设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。 +设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。 -注意: 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。 +注意: 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。 -示例 1: +示例 1: 输入: [3,3,5,0,0,3,1,4] 输出: 6 解释: 在第 4 天(股票价格 = 0)的时候买入,在第 6 天(股票价格 = 3)的时候卖出,这笔交易所能获得利润 = 3-0 = 3 。 -  随后,在第 7 天(股票价格 = 1)的时候买入,在第 8 天 (股票价格 = 4)的时候卖出,这笔交易所能获得利润 = 4-1 = 3 。 + 随后,在第 7 天(股票价格 = 1)的时候买入,在第 8 天 (股票价格 = 4)的时候卖出,这笔交易所能获得利润 = 4-1 = 3 。 示例 2: 输入: [1,2,3,4,5] 输出: 4 -解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。   -  注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。   -  因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。 +解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。 + 注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。 + 因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。 示例 3: 输入: [7,6,4,3,1] diff --git "a/src/main/java/algorithm_practice/LeetCode/code100/H124_\344\272\214\345\217\211\346\240\221\344\270\255\347\232\204\346\234\200\345\244\247\350\267\257\345\276\204\345\222\214.java" "b/src/main/java/algorithm_practice/LeetCode/code100/H124_\344\272\214\345\217\211\346\240\221\344\270\255\347\232\204\346\234\200\345\244\247\350\267\257\345\276\204\345\222\214.java" index fc14e36d..1c2cd737 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code100/H124_\344\272\214\345\217\211\346\240\221\344\270\255\347\232\204\346\234\200\345\244\247\350\267\257\345\276\204\345\222\214.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code100/H124_\344\272\214\345\217\211\346\240\221\344\270\255\347\232\204\346\234\200\345\244\247\350\267\257\345\276\204\345\222\214.java" @@ -10,7 +10,7 @@ 本题中,路径被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。 -  + 示例 1: @@ -21,15 +21,15 @@ 2 3 输出:6 -示例 2: +示例 2: 输入:[-10,9,20,null,null,15,7] -  -10 -   / \ -  9  20 -    /  \ -   15   7 + -10 + / \ + 9 20 + / \ + 15 7 输出:42 diff --git "a/src/main/java/algorithm_practice/LeetCode/code100/H128_\346\234\200\351\225\277\350\277\236\347\273\255\345\272\217\345\210\227.java" "b/src/main/java/algorithm_practice/LeetCode/code100/H128_\346\234\200\351\225\277\350\277\236\347\273\255\345\272\217\345\210\227.java" index 3441b9f9..d5349f16 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code100/H128_\346\234\200\351\225\277\350\277\236\347\273\255\345\272\217\345\210\227.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code100/H128_\346\234\200\351\225\277\350\277\236\347\273\255\345\272\217\345\210\227.java" @@ -8,11 +8,11 @@ /* 给定一个未排序的整数数组,找出最长连续序列的长度。 -要求算法的时间复杂度为 O(n)。 +要求算法的时间复杂度为 O(n)。 示例: -输入: [100, 4, 200, 1, 3, 2] +输入: [100, 4, 200, 1, 3, 2] 输出: 4 解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。 diff --git "a/src/main/java/algorithm_practice/LeetCode/code100/H140_\345\215\225\350\257\215\346\213\206\345\210\2062.java" "b/src/main/java/algorithm_practice/LeetCode/code100/H140_\345\215\225\350\257\215\346\213\206\345\210\2062.java" index 1fecbdd9..4a8e1f5a 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code100/H140_\345\215\225\350\257\215\346\213\206\345\210\2062.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code100/H140_\345\215\225\350\257\215\346\213\206\345\210\2062.java" @@ -21,8 +21,8 @@ wordDict = ["cat", "cats", "and", "sand", "dog"] 输出: [ -  "cats and dog", -  "cat sand dog" + "cats and dog", + "cat sand dog" ] 示例 2: @@ -31,12 +31,12 @@ wordDict = ["apple", "pen", "applepen", "pine", "pineapple"] 输出: [ -  "pine apple pen apple", -  "pineapple pen apple", -  "pine applepen apple" + "pine apple pen apple", + "pineapple pen apple", + "pine applepen apple" ] 解释: 注意你可以重复使用字典中的单词。 -示例 3: +示例 3: 输入: s = "catsandog" diff --git "a/src/main/java/algorithm_practice/LeetCode/code100/H164_\346\234\200\345\244\247\351\227\264\350\267\235.java" "b/src/main/java/algorithm_practice/LeetCode/code100/H164_\346\234\200\345\244\247\351\227\264\350\267\235.java" index 7624a3e1..54b431a4 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code100/H164_\346\234\200\345\244\247\351\227\264\350\267\235.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code100/H164_\346\234\200\345\244\247\351\227\264\350\267\235.java" @@ -11,12 +11,12 @@ 如果数组元素个数小于 2,则返回 0。 -示例 1: +示例 1: 输入: [3,6,9,1] 输出: 3 解释: 排序后的数组是 [1,3,6,9], 其中相邻元素 (3,6) 和 (6,9) 之间都存在最大差值 3。 -示例 2: +示例 2: 输入: [10] 输出: 0 diff --git "a/src/main/java/algorithm_practice/LeetCode/code100/H188_\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\2724.java" "b/src/main/java/algorithm_practice/LeetCode/code100/H188_\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\2724.java" index 24360181..8ef068fe 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code100/H188_\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\2724.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code100/H188_\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\2724.java" @@ -8,9 +8,9 @@ 设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。 -注意: 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。 +注意: 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。 -示例 1: +示例 1: 输入: [2,4,1], k = 2 输出: 2 @@ -20,7 +20,7 @@ 输入: [3,2,6,5,0,3], k = 2 输出: 7 解释: 在第 2 天 (股票价格 = 2) 的时候买入,在第 3 天 (股票价格 = 6) 的时候卖出, 这笔交易所能获得利润 = 6-2 = 4 。 -  随后,在第 5 天 (股票价格 = 0) 的时候买入,在第 6 天 (股票价格 = 3) 的时候卖出, 这笔交易所能获得利润 = 3-0 = 3 。 + 随后,在第 5 天 (股票价格 = 0) 的时候买入,在第 6 天 (股票价格 = 3) 的时候卖出, 这笔交易所能获得利润 = 3-0 = 3 。 来源:力扣(LeetCode) diff --git "a/src/main/java/algorithm_practice/LeetCode/code100/M102_\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\346\254\241\351\201\215\345\216\206.java" "b/src/main/java/algorithm_practice/LeetCode/code100/M102_\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\346\254\241\351\201\215\345\216\206.java" index f314ad9d..4fdf4a78 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code100/M102_\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\346\254\241\351\201\215\345\216\206.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code100/M102_\344\272\214\345\217\211\346\240\221\347\232\204\345\261\202\346\254\241\351\201\215\345\216\206.java" @@ -11,7 +11,7 @@ 给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。 例如: -给定二叉树: [3,9,20,null,null,15,7], +给定二叉树: [3,9,20,null,null,15,7], 3 / \ diff --git "a/src/main/java/algorithm_practice/LeetCode/code100/M127_\345\215\225\350\257\215\346\216\245\351\276\231.java" "b/src/main/java/algorithm_practice/LeetCode/code100/M127_\345\215\225\350\257\215\346\216\245\351\276\231.java" index 17bcea0a..bab22208 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code100/M127_\345\215\225\350\257\215\346\216\245\351\276\231.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code100/M127_\345\215\225\350\257\215\346\216\245\351\276\231.java" @@ -7,7 +7,7 @@ import java.util.*; /* -给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度。转换需遵循如下规则: +给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度。转换需遵循如下规则: 每次转换只能改变一个字母。 转换过程中的中间单词必须是字典中的单词。 @@ -18,7 +18,7 @@ 所有单词只由小写字母组成。 字典中不存在重复的单词。 你可以假设 beginWord 和 endWord 是非空的,且二者不相同。 -示例 1: +示例 1: 输入: beginWord = "hit", @@ -36,9 +36,9 @@ endWord = "cog" wordList = ["hot","dot","dog","lot","log"] -输出: 0 +输出: 0 -解释: endWord "cog" 不在字典中,所以无法进行转换。 +解释: endWord "cog" 不在字典中,所以无法进行转换。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/word-ladder diff --git "a/src/main/java/algorithm_practice/LeetCode/code100/M134_\345\212\240\346\262\271\347\253\231.java" "b/src/main/java/algorithm_practice/LeetCode/code100/M134_\345\212\240\346\262\271\347\253\231.java" index aa5d2267..b585a03e 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code100/M134_\345\212\240\346\262\271\347\253\231.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code100/M134_\345\212\240\346\262\271\347\253\231.java" @@ -4,18 +4,18 @@ import org.junit.Test; /** - * 在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。 + * 在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。 *

- * 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。 + * 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。 *

* 如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。 *

- * 说明:  + * 说明: *

* 如果题目有解,该答案即为唯一答案。 * 输入数组均为非空数组,且长度相同。 * 输入数组中的元素均为非负数。 - * 示例 1: + * 示例 1: *

* 输入: * gas = [1,2,3,4,5] diff --git "a/src/main/java/algorithm_practice/LeetCode/code100/M139_\345\215\225\350\257\215\346\213\206\345\210\206.java" "b/src/main/java/algorithm_practice/LeetCode/code100/M139_\345\215\225\350\257\215\346\213\206\345\210\206.java" index 181fb60f..4a846672 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code100/M139_\345\215\225\350\257\215\346\213\206\345\210\206.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code100/M139_\345\215\225\350\257\215\346\213\206\345\210\206.java" @@ -10,7 +10,7 @@ import java.util.Set; /* -给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。 +给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。 说明: @@ -26,7 +26,7 @@ 输入: s = "applepenapple", wordDict = ["apple", "pen"] 输出: true 解释: 返回 true 因为 "applepenapple" 可以被拆分成 "apple pen apple"。 -  注意你可以重复使用字典中的单词。 + 注意你可以重复使用字典中的单词。 示例 3: 输入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"] diff --git "a/src/main/java/algorithm_practice/LeetCode/code100/M144_\344\272\214\345\217\211\346\240\221\347\232\204\345\211\215\345\272\217\351\201\215\345\216\206.java" "b/src/main/java/algorithm_practice/LeetCode/code100/M144_\344\272\214\345\217\211\346\240\221\347\232\204\345\211\215\345\272\217\351\201\215\345\216\206.java" index b445c54d..cd21cbcc 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code100/M144_\344\272\214\345\217\211\346\240\221\347\232\204\345\211\215\345\272\217\351\201\215\345\216\206.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code100/M144_\344\272\214\345\217\211\346\240\221\347\232\204\345\211\215\345\272\217\351\201\215\345\216\206.java" @@ -22,7 +22,7 @@ 3 输出: [1,2,3] -进阶: 递归算法很简单,你可以通过迭代算法完成吗? +进阶: 递归算法很简单,你可以通过迭代算法完成吗? 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/binary-tree-preorder-traversal diff --git "a/src/main/java/algorithm_practice/LeetCode/code100/M145_\344\272\214\345\217\211\346\240\221\347\232\204\345\220\216\345\272\217\351\201\215\345\216\206.java" "b/src/main/java/algorithm_practice/LeetCode/code100/M145_\344\272\214\345\217\211\346\240\221\347\232\204\345\220\216\345\272\217\351\201\215\345\216\206.java" index 0b2c7f56..57f0cbf6 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code100/M145_\344\272\214\345\217\211\346\240\221\347\232\204\345\220\216\345\272\217\351\201\215\345\216\206.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code100/M145_\344\272\214\345\217\211\346\240\221\347\232\204\345\220\216\345\272\217\351\201\215\345\216\206.java" @@ -23,7 +23,7 @@ 3 输出: [3,2,1] -进阶: 递归算法很简单,你可以通过迭代算法完成吗? +进阶: 递归算法很简单,你可以通过迭代算法完成吗? 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/binary-tree-postorder-traversal diff --git "a/src/main/java/algorithm_practice/LeetCode/code100/M146_LRU\347\274\223\345\255\230\346\234\272\345\210\266.java" "b/src/main/java/algorithm_practice/LeetCode/code100/M146_LRU\347\274\223\345\255\230\346\234\272\345\210\266.java" index 084ed096..0f235e7a 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code100/M146_LRU\347\274\223\345\255\230\346\234\272\345\210\266.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code100/M146_LRU\347\274\223\345\255\230\346\234\272\345\210\266.java" @@ -6,13 +6,13 @@ import java.util.HashMap; /* -运用你所掌握的数据结构,设计和实现一个  LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。 +运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。 获取数据 get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。 写入数据 put(key, val) - 如果密钥不存在,则写入其数据值。当缓存容量达到上限时,它应该在写入新数据之前删除最近最少使用的数据值,从而为新的数据值留出空间。 进阶: -你是否可以在 O(1) 时间复杂度内完成这两种操作? +你是否可以在 O(1) 时间复杂度内完成这两种操作? 示例: diff --git "a/src/main/java/algorithm_practice/LeetCode/code100/M147_\345\257\271\351\223\276\350\241\250\350\277\233\350\241\214\346\217\222\345\205\245\346\216\222\345\272\217.java" "b/src/main/java/algorithm_practice/LeetCode/code100/M147_\345\257\271\351\223\276\350\241\250\350\277\233\350\241\214\346\217\222\345\205\245\346\216\222\345\272\217.java" index 765e8a56..f08c35ba 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code100/M147_\345\257\271\351\223\276\350\241\250\350\277\233\350\241\214\346\217\222\345\205\245\346\216\222\345\272\217.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code100/M147_\345\257\271\351\223\276\350\241\250\350\277\233\350\241\214\346\217\222\345\205\245\346\216\222\345\272\217.java" @@ -14,20 +14,20 @@ 插入排序的动画演示如上。从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示)。 每次迭代时,从输入数据中移除一个元素(用红色表示),并原地将其插入到已排好序的链表中。 -   + 插入排序算法: 插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。 每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。 重复直到所有输入数据插入完为止。 -   + 示例 1: 输入: 4->2->1->3 输出: 1->2->3->4 - 示例 2: + 示例 2: 输入: -1->5->3->4->0 输出: -1->0->3->4->5 diff --git "a/src/main/java/algorithm_practice/LeetCode/code100/M148_\346\216\222\345\272\217\351\223\276\350\241\250.java" "b/src/main/java/algorithm_practice/LeetCode/code100/M148_\346\216\222\345\272\217\351\223\276\350\241\250.java" index 49e1b107..2f7607d9 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code100/M148_\346\216\222\345\272\217\351\223\276\350\241\250.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code100/M148_\346\216\222\345\272\217\351\223\276\350\241\250.java" @@ -8,11 +8,11 @@ import org.junit.Test; /** - 给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。 + 给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。 进阶: - 你可以在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗? -   + 你可以在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗? + 示例 1: 输入:head = [4,2,1,3] diff --git "a/src/main/java/algorithm_practice/LeetCode/code100/M153_\345\257\273\346\211\276\346\227\213\350\275\254\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\347\232\204\346\234\200\345\260\217\345\200\274.java" "b/src/main/java/algorithm_practice/LeetCode/code100/M153_\345\257\273\346\211\276\346\227\213\350\275\254\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\347\232\204\346\234\200\345\260\217\345\200\274.java" index 77e6d6d6..96bfeea1 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code100/M153_\345\257\273\346\211\276\346\227\213\350\275\254\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\347\232\204\346\234\200\345\260\217\345\200\274.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code100/M153_\345\257\273\346\211\276\346\227\213\350\275\254\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\347\232\204\346\234\200\345\260\217\345\200\274.java" @@ -5,7 +5,7 @@ /* 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 -( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。 +( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。 请找出其中最小的元素。 你可以假设数组中不存在重复元素。 diff --git "a/src/main/java/algorithm_practice/LeetCode/code1000/E1030_\350\267\235\347\246\273\351\241\272\345\272\217\346\216\222\345\210\227\347\237\251\351\230\265\345\215\225\345\205\203\346\240\274.java" "b/src/main/java/algorithm_practice/LeetCode/code1000/E1030_\350\267\235\347\246\273\351\241\272\345\272\217\346\216\222\345\210\227\347\237\251\351\230\265\345\215\225\345\205\203\346\240\274.java" index c868b59b..9d604986 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code1000/E1030_\350\267\235\347\246\273\351\241\272\345\272\217\346\216\222\345\210\227\347\237\251\351\230\265\345\215\225\345\205\203\346\240\274.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code1000/E1030_\350\267\235\347\246\273\351\241\272\345\272\217\346\216\222\345\210\227\347\237\251\351\230\265\345\215\225\345\205\203\346\240\274.java" @@ -10,11 +10,11 @@ /** 给出 R 行 C 列的矩阵,其中的单元格的整数坐标为 (r, c),满足 0 <= r < R 且 0 <= c < C。 - 另外,我们在该矩阵中给出了一个坐标为 (r0, c0) 的单元格。 + 另外,我们在该矩阵中给出了一个坐标为 (r0, c0) 的单元格。 返回矩阵中的所有单元格的坐标,并按到 (r0, c0) 的距离从最小到最大的顺序排,其中,两单元格(r1, c1) 和 (r2, c2) 之间的距离是曼哈顿距离,|r1 - r2| + |c1 - c2|。(你可以按任何满足此条件的顺序返回答案。) -   + 示例 1: @@ -33,7 +33,7 @@ 输出:[[1,2],[0,2],[1,1],[0,1],[1,0],[0,0]] 解释:从 (r0, c0) 到其他单元格的距离为:[0,1,1,2,2,3] 其他满足题目要求的答案也会被视为正确,例如 [[1,2],[1,1],[0,2],[1,0],[0,1],[0,0]]。 -   + 提示: diff --git "a/src/main/java/algorithm_practice/LeetCode/code1000/E1071_\345\255\227\347\254\246\344\270\262\347\232\204\346\234\200\345\244\247\345\205\254\345\233\240\345\255\220.java" "b/src/main/java/algorithm_practice/LeetCode/code1000/E1071_\345\255\227\347\254\246\344\270\262\347\232\204\346\234\200\345\244\247\345\205\254\345\233\240\345\255\220.java" index 2a5e6127..25581c96 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code1000/E1071_\345\255\227\347\254\246\344\270\262\347\232\204\346\234\200\345\244\247\345\205\254\345\233\240\345\255\220.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code1000/E1071_\345\255\227\347\254\246\344\270\262\347\232\204\346\234\200\345\244\247\345\205\254\345\233\240\345\255\220.java" @@ -4,8 +4,8 @@ import org.junit.Test; /* -对于字符串 S 和 T,只有在 S = T + ... + T(T 与自身连接 1 次或多次)时,我们才认定 “T 能除尽 S”。 -返回最长字符串 X,要求满足 X 能除尽 str1 且 X 能除尽 str2。 +对于字符串 S 和 T,只有在 S = T + ... + T(T 与自身连接 1 次或多次)时,我们才认定 “T 能除尽 S”。 +返回最长字符串 X,要求满足 X 能除尽 str1 且 X 能除尽 str2。 示例 1: @@ -19,13 +19,13 @@ 输入:str1 = "LEET", str2 = "CODE" 输出:"" -  + 提示: 1 <= str1.length <= 1000 1 <= str2.length <= 1000 -str1[i] 和 str2[i] 为大写英文字母 +str1[i] 和 str2[i] 为大写英文字母 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/greatest-common-divisor-of-strings diff --git "a/src/main/java/algorithm_practice/LeetCode/code1100/E1122_\346\225\260\347\273\204\347\232\204\347\233\270\345\257\271\346\216\222\345\272\217.java" "b/src/main/java/algorithm_practice/LeetCode/code1100/E1122_\346\225\260\347\273\204\347\232\204\347\233\270\345\257\271\346\216\222\345\272\217.java" index f7f800bd..1b4d5d7e 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code1100/E1122_\346\225\260\347\273\204\347\232\204\347\233\270\345\257\271\346\216\222\345\272\217.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code1100/E1122_\346\225\260\347\273\204\347\232\204\347\233\270\345\257\271\346\216\222\345\272\217.java" @@ -7,26 +7,26 @@ import java.util.Map; /** - 给你两个数组,arr1 和 arr2, + 给你两个数组,arr1 和 arr2, - arr2 中的元素各不相同 - arr2 中的每个元素都出现在 arr1 中 - 对 arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。 + arr2 中的元素各不相同 + arr2 中的每个元素都出现在 arr1 中 + 对 arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。 -   + 示例: 输入:arr1 = [2,3,1,3,2,4,6,7,9,2,19], arr2 = [2,1,4,3,9,6] 输出:[2,2,2,1,4,3,3,9,6,7,19] -   + 提示: 1 <= arr1.length, arr2.length <= 1000 0 <= arr1[i], arr2[i] <= 1000 - arr2 中的元素 arr2[i] 各不相同 - arr2 中的每个元素 arr2[i] 都出现在 arr1 中 + arr2 中的元素 arr2[i] 各不相同 + arr2 中的每个元素 arr2[i] 都出现在 arr1 中 来源:力扣(LeetCode) diff --git "a/src/main/java/algorithm_practice/LeetCode/code1100/E1160_\346\213\274\345\206\231\345\215\225\350\257\215.java" "b/src/main/java/algorithm_practice/LeetCode/code1100/E1160_\346\213\274\345\206\231\345\215\225\350\257\215.java" index b6d5f9fd..dbe5d7a0 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code1100/E1160_\346\213\274\345\206\231\345\215\225\350\257\215.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code1100/E1160_\346\213\274\345\206\231\345\215\225\350\257\215.java" @@ -4,15 +4,15 @@ import org.junit.Test; /* -给你一份『词汇表』(字符串数组) words 和一张『字母表』(字符串) chars。 +给你一份『词汇表』(字符串数组) words 和一张『字母表』(字符串) chars。 -假如你可以用 chars 中的『字母』(字符)拼写出 words 中的某个『单词』(字符串),那么我们就认为你掌握了这个单词。 +假如你可以用 chars 中的『字母』(字符)拼写出 words 中的某个『单词』(字符串),那么我们就认为你掌握了这个单词。 注意:每次拼写时,chars 中的每个字母都只能用一次。 -返回词汇表 words 中你掌握的所有单词的 长度之和。 +返回词汇表 words 中你掌握的所有单词的 长度之和。 -  + 示例 1: @@ -26,12 +26,12 @@ 输出:10 解释: 可以形成字符串 "hello" 和 "world",所以答案是 5 + 5 = 10。 -  + 提示: 1 <= words.length <= 1000 -1 <= words[i].length, chars.length <= 100 +1 <= words[i].length, chars.length <= 100 所有字符串中都仅包含小写英文字母 diff --git "a/src/main/java/algorithm_practice/LeetCode/code200/E237_\345\210\240\351\231\244\351\223\276\350\241\250\344\270\255\347\232\204\347\273\223\347\202\271.java" "b/src/main/java/algorithm_practice/LeetCode/code200/E237_\345\210\240\351\231\244\351\223\276\350\241\250\344\270\255\347\232\204\347\273\223\347\202\271.java" index 800b24de..a2cc7dc6 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code200/E237_\345\210\240\351\231\244\351\223\276\350\241\250\344\270\255\347\232\204\347\273\223\347\202\271.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code200/E237_\345\210\240\351\231\244\351\223\276\350\241\250\344\270\255\347\232\204\347\273\223\347\202\271.java" @@ -8,17 +8,17 @@ /* 请编写一个函数,使其可以删除某个链表中给定的(非末尾)结点,你将只被给定要求被删除的结点。 -现有一个链表 -- head = [4,5,1,9],它可以表示为: 4->5->1->9 +现有一个链表 -- head = [4,5,1,9],它可以表示为: 4->5->1->9 示例 1: 输入: head = [4,5,1,9], node = 5 输出: [4,1,9] -解释: 给定你链表中值为 5 的第二个结点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9. +解释: 给定你链表中值为 5 的第二个结点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9. 示例 2: 输入: head = [4,5,1,9], node = 1 输出: [4,5,9] -解释: 给定你链表中值为 1 的第三个结点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9. +解释: 给定你链表中值为 1 的第三个结点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9. 说明: 链表至少包含两个节点。 diff --git "a/src/main/java/algorithm_practice/LeetCode/code200/E242_\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.java" "b/src/main/java/algorithm_practice/LeetCode/code200/E242_\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.java" index 9ae43586..1c402d94 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code200/E242_\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code200/E242_\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.java" @@ -9,7 +9,7 @@ /* 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 - 示例 1: + 示例 1: 输入: s = "anagram", t = "nagaram" 输出: true diff --git "a/src/main/java/algorithm_practice/LeetCode/code200/H297_\344\272\214\345\217\211\346\240\221\347\232\204\345\272\217\345\210\227\345\214\226\344\270\216\345\217\215\345\272\217\345\210\227\345\214\226.java" "b/src/main/java/algorithm_practice/LeetCode/code200/H297_\344\272\214\345\217\211\346\240\221\347\232\204\345\272\217\345\210\227\345\214\226\344\270\216\345\217\215\345\272\217\345\210\227\345\214\226.java" index 37cc48c7..75366fe1 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code200/H297_\344\272\214\345\217\211\346\240\221\347\232\204\345\272\217\345\210\227\345\214\226\344\270\216\345\217\215\345\272\217\345\210\227\345\214\226.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code200/H297_\344\272\214\345\217\211\346\240\221\347\232\204\345\272\217\345\210\227\345\214\226\344\270\216\345\217\215\345\272\217\345\210\227\345\214\226.java" @@ -14,7 +14,7 @@ 请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。 -示例:  +示例: 你可以将以下二叉树: @@ -25,9 +25,9 @@ 4 5 序列化为 "[1,2,3,null,null,4,5]" -提示: 这与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。 +提示: 这与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。 -说明: 不要使用类的成员 / 全局 / 静态变量来存储状态,你的序列化和反序列化算法应该是无状态的。 +说明: 不要使用类的成员 / 全局 / 静态变量来存储状态,你的序列化和反序列化算法应该是无状态的。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/serialize-and-deserialize-binary-tree diff --git "a/src/main/java/algorithm_practice/LeetCode/code200/M207_\350\257\276\347\250\213\350\241\250.java" "b/src/main/java/algorithm_practice/LeetCode/code200/M207_\350\257\276\347\250\213\350\241\250.java" index f42fb4cc..c13747c7 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code200/M207_\350\257\276\347\250\213\350\241\250.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code200/M207_\350\257\276\347\250\213\350\241\250.java" @@ -6,31 +6,31 @@ import java.util.*; /* -你这个学期必须选修 numCourse 门课程,记为 0 到 numCourse-1 。 +你这个学期必须选修 numCourse 门课程,记为 0 到 numCourse-1 。 -在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们:[0,1] +在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们:[0,1] 给定课程总量以及它们的先决条件,请你判断是否可能完成所有课程的学习? -  + 示例 1: 输入: 2, [[1,0]] 输出: true -解释: 总共有 2 门课程。学习课程 1 之前,你需要完成课程 0。所以这是可能的。 +解释: 总共有 2 门课程。学习课程 1 之前,你需要完成课程 0。所以这是可能的。 示例 2: 输入: 2, [[1,0],[0,1]] 输出: false -解释: 总共有 2 门课程。学习课程 1 之前,你需要先完成​课程 0;并且学习课程 0 之前,你还应先完成课程 1。这是不可能的。 -  +解释: 总共有 2 门课程。学习课程 1 之前,你需要先完成​课程 0;并且学习课程 0 之前,你还应先完成课程 1。这是不可能的。 + 提示: 输入的先决条件是由 边缘列表 表示的图形,而不是 邻接矩阵 。详情请参见图的表示法。 你可以假定输入的先决条件中没有重复的边。 -1 <= numCourses <= 10^5 +1 <= numCourses <= 10^5 来源:力扣(LeetCode) diff --git "a/src/main/java/algorithm_practice/LeetCode/code200/M210_\350\257\276\347\250\213\350\241\2502.java" "b/src/main/java/algorithm_practice/LeetCode/code200/M210_\350\257\276\347\250\213\350\241\2502.java" index a8a28496..11dda101 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code200/M210_\350\257\276\347\250\213\350\241\2502.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code200/M210_\350\257\276\347\250\213\350\241\2502.java" @@ -7,25 +7,25 @@ import java.util.*; /* -现在你总共有 n 门课需要选,记为 0 到 n-1。 +现在你总共有 n 门课需要选,记为 0 到 n-1。 -在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1] +在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1] 给定课程总量以及它们的先决条件,返回你为了学完所有课程所安排的学习顺序。 可能会有多个正确的顺序,你只要返回一种就可以了。如果不可能完成所有课程,返回一个空数组。 -示例 1: +示例 1: 输入: 2, [[1,0]] 输出: [0,1] -解释: 总共有 2 门课程。要学习课程 1,你需要先完成课程 0。因此,正确的课程顺序为 [0,1] 。 -示例 2: +解释: 总共有 2 门课程。要学习课程 1,你需要先完成课程 0。因此,正确的课程顺序为 [0,1] 。 +示例 2: 输入: 4, [[1,0],[2,0],[3,1],[3,2]] 输出: [0,1,2,3] or [0,2,1,3] -解释: 总共有 4 门课程。要学习课程 3,你应该先完成课程 1 和课程 2。并且课程 1 和课程 2 都应该排在课程 0 之后。 -  因此,一个正确的课程顺序是 [0,1,2,3] 。另一个正确的排序是 [0,2,1,3] 。 +解释: 总共有 4 门课程。要学习课程 3,你应该先完成课程 1 和课程 2。并且课程 1 和课程 2 都应该排在课程 0 之后。 + 因此,一个正确的课程顺序是 [0,1,2,3] 。另一个正确的排序是 [0,2,1,3] 。 说明: 输入的先决条件是由边缘列表表示的图形,而不是邻接矩阵。详情请参见图的表示法。 @@ -34,7 +34,7 @@ 这个问题相当于查找一个循环是否存在于有向图中。如果存在循环,则不存在拓扑排序,因此不可能选取所有课程进行学习。 通过 DFS 进行拓扑排序 - 一个关于Coursera的精彩视频教程(21分钟),介绍拓扑排序的基本概念。 -拓扑排序也可以通过 BFS 完成。 +拓扑排序也可以通过 BFS 完成。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/course-schedule-ii diff --git "a/src/main/java/algorithm_practice/LeetCode/code200/M213_\346\211\223\345\256\266\345\212\253\350\210\2152.java" "b/src/main/java/algorithm_practice/LeetCode/code200/M213_\346\211\223\345\256\266\345\212\253\350\210\2152.java" index 4dfa71a6..b14d3d3a 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code200/M213_\346\211\223\345\256\266\345\212\253\350\210\2152.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code200/M213_\346\211\223\345\256\266\345\212\253\350\210\2152.java" @@ -8,9 +8,9 @@ 给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,能够偷窃到的最高金额。 -  + -示例 1: +示例 1: 输入:nums = [2,3,2] 输出:3 @@ -20,12 +20,12 @@ 输入:nums = [1,2,3,1] 输出:4 解释:你可以先偷窃 1 号房屋(金额 = 1),然后偷窃 3 号房屋(金额 = 3)。 -  偷窃到的最高金额 = 1 + 3 = 4 。 + 偷窃到的最高金额 = 1 + 3 = 4 。 示例 3: 输入:nums = [0] 输出:0 -  + 提示: diff --git "a/src/main/java/algorithm_practice/LeetCode/code200/M215_\346\225\260\347\273\204\344\270\255\347\232\204\347\254\254K\344\270\252\346\234\200\345\244\247\345\205\203\347\264\240.java" "b/src/main/java/algorithm_practice/LeetCode/code200/M215_\346\225\260\347\273\204\344\270\255\347\232\204\347\254\254K\344\270\252\346\234\200\345\244\247\345\205\203\347\264\240.java" index 77866c87..be663cc6 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code200/M215_\346\225\260\347\273\204\344\270\255\347\232\204\347\254\254K\344\270\252\346\234\200\345\244\247\345\205\203\347\264\240.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code200/M215_\346\225\260\347\273\204\344\270\255\347\232\204\347\254\254K\344\270\252\346\234\200\345\244\247\345\205\203\347\264\240.java" @@ -12,7 +12,7 @@ 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 -示例 2: +示例 2: 输入: [3,2,3,1,2,4,5,5,6] 和 k = 4 输出: 4 diff --git "a/src/main/java/algorithm_practice/LeetCode/code200/M216_\347\273\204\345\220\210\346\200\273\345\222\2143.java" "b/src/main/java/algorithm_practice/LeetCode/code200/M216_\347\273\204\345\220\210\346\200\273\345\222\2143.java" index 87cc8017..4239b64b 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code200/M216_\347\273\204\345\220\210\346\200\273\345\222\2143.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code200/M216_\347\273\204\345\220\210\346\200\273\345\222\2143.java" @@ -10,12 +10,12 @@ import java.util.List; /* -找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。 +找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。 说明: 所有数字都是正整数。 -解集不能包含重复的组合。  +解集不能包含重复的组合。 示例 1: 输入: k = 3, n = 7 diff --git "a/src/main/java/algorithm_practice/LeetCode/code200/M222_\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.java" "b/src/main/java/algorithm_practice/LeetCode/code200/M222_\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.java" index 9d5d07b2..ab4e215d 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code200/M222_\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code200/M222_\345\256\214\345\205\250\344\272\214\345\217\211\346\240\221\347\232\204\350\212\202\347\202\271\344\270\252\346\225\260.java" @@ -10,7 +10,7 @@ 说明: -完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。 +完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。 示例: diff --git "a/src/main/java/algorithm_practice/LeetCode/code300/H329_\347\237\251\351\230\265\344\270\255\347\232\204\346\234\200\351\225\277\351\200\222\345\242\236\350\267\257\345\276\204.java" "b/src/main/java/algorithm_practice/LeetCode/code300/H329_\347\237\251\351\230\265\344\270\255\347\232\204\346\234\200\351\225\277\351\200\222\345\242\236\350\267\257\345\276\204.java" index c0e3d2f4..69deffcf 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code300/H329_\347\237\251\351\230\265\344\270\255\347\232\204\346\234\200\351\225\277\351\200\222\345\242\236\350\267\257\345\276\204.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code300/H329_\347\237\251\351\230\265\344\270\255\347\232\204\346\234\200\351\225\277\351\200\222\345\242\236\350\267\257\345\276\204.java" @@ -17,7 +17,7 @@ [2,1,1] ] 输出: 4 -解释: 最长递增路径为 [1, 2, 6, 9]。 +解释: 最长递增路径为 [1, 2, 6, 9]。 示例 2: 输入: nums = @@ -27,7 +27,7 @@ [2,2,1] ] 输出: 4 -解释: 最长递增路径是 [3, 4, 5, 6]。注意不允许在对角线方向上移动。 +解释: 最长递增路径是 [3, 4, 5, 6]。注意不允许在对角线方向上移动。 来源:力扣(LeetCode) diff --git "a/src/main/java/algorithm_practice/LeetCode/code300/M300_\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.java" "b/src/main/java/algorithm_practice/LeetCode/code300/M300_\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.java" index 6e65164e..ed8873ff 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code300/M300_\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code300/M300_\346\234\200\351\225\277\344\270\212\345\215\207\345\255\220\345\272\217\345\210\227.java" @@ -13,12 +13,12 @@ 输入: [10,9,2,5,3,7,101,18] 输出: 4 -解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。 +解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。 说明: 可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。 -你算法的时间复杂度应该为 O(n2) 。 -进阶: 你能将算法的时间复杂度降低到 O(n log n) 吗? +你算法的时间复杂度应该为 O(n2) 。 +进阶: 你能将算法的时间复杂度降低到 O(n log n) 吗? diff --git "a/src/main/java/algorithm_practice/LeetCode/code300/M309_\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.java" "b/src/main/java/algorithm_practice/LeetCode/code300/M309_\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.java" index 7ea1b294..328a5409 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code300/M309_\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code300/M309_\346\234\200\344\275\263\344\271\260\345\215\226\350\202\241\347\245\250\346\227\266\346\234\272\345\220\253\345\206\267\345\206\273\346\234\237.java" @@ -4,7 +4,7 @@ import org.junit.Test; /* -给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。​ +给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。​ 设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票): diff --git "a/src/main/java/algorithm_practice/LeetCode/code300/M322_\351\233\266\351\222\261\345\205\221\346\215\242.java" "b/src/main/java/algorithm_practice/LeetCode/code300/M322_\351\233\266\351\222\261\345\205\221\346\215\242.java" index 7b26a4fb..a0ba02a1 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code300/M322_\351\233\266\351\222\261\345\205\221\346\215\242.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code300/M322_\351\233\266\351\222\261\345\205\221\346\215\242.java" @@ -5,13 +5,13 @@ import org.junit.Test; /* -给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。 +给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。 你可以认为每种硬币的数量是无限的。 -  + -示例 1: +示例 1: 输入:coins = [1, 2, 5], amount = 11 输出:3 @@ -32,7 +32,7 @@ 输入:coins = [1], amount = 2 输出:2 -  + 提示: diff --git "a/src/main/java/algorithm_practice/LeetCode/code300/M337_\346\211\223\345\256\266\345\212\253\350\210\2153.java" "b/src/main/java/algorithm_practice/LeetCode/code300/M337_\346\211\223\345\256\266\345\212\253\350\210\2153.java" index 7c253749..fd1305e2 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code300/M337_\346\211\223\345\256\266\345\212\253\350\210\2153.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code300/M337_\346\211\223\345\256\266\345\212\253\350\210\2153.java" @@ -26,19 +26,19 @@ 3 1 输出: 7 -解释: 小偷一晚能够盗取的最高金额 = 3 + 3 + 1 = 7. +解释: 小偷一晚能够盗取的最高金额 = 3 + 3 + 1 = 7. 示例 2: 输入: [3,4,5,1,3,null,1] -  3 + 3 / \ 4 5 / \ \ 1 3 1 输出: 9 -解释: 小偷一晚能够盗取的最高金额 = 4 + 5 = 9. +解释: 小偷一晚能够盗取的最高金额 = 4 + 5 = 9. 来源:力扣(LeetCode) diff --git "a/src/main/java/algorithm_practice/LeetCode/code300/M365_\346\260\264\345\243\266\351\227\256\351\242\230.java" "b/src/main/java/algorithm_practice/LeetCode/code300/M365_\346\260\264\345\243\266\351\227\256\351\242\230.java" index 98e5435c..8051edb2 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code300/M365_\346\260\264\345\243\266\351\227\256\351\242\230.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code300/M365_\346\260\264\345\243\266\351\227\256\351\242\230.java" @@ -4,9 +4,9 @@ import org.junit.Test; /* -有两个容量分别为 x升 和 y升 的水壶以及无限多的水。请判断能否通过使用这两个水壶,从而可以得到恰好 z升 的水? +有两个容量分别为 x升 和 y升 的水壶以及无限多的水。请判断能否通过使用这两个水壶,从而可以得到恰好 z升 的水? -如果可以,最后请用以上水壶中的一或两个来盛放取得的 z升 水。 +如果可以,最后请用以上水壶中的一或两个来盛放取得的 z升 水。 你允许: diff --git "a/src/main/java/algorithm_practice/LeetCode/code400/E496_\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\2401.java" "b/src/main/java/algorithm_practice/LeetCode/code400/E496_\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\2401.java" index 3c83d655..7decc500 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code400/E496_\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\2401.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code400/E496_\344\270\213\344\270\200\344\270\252\346\233\264\345\244\247\345\205\203\347\264\2401.java" @@ -8,11 +8,11 @@ import java.util.Stack; /* -给定两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。找到 nums1 中每个元素在 nums2 中的下一个比其大的值。 +给定两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。找到 nums1 中每个元素在 nums2 中的下一个比其大的值。 -nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出 -1 。 +nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出 -1 。 -  + 示例 1: @@ -27,14 +27,14 @@ 输入: nums1 = [2,4], nums2 = [1,2,3,4]. 输出: [3,-1] 解释: -  对于 num1 中的数字 2 ,第二个数组中的下一个较大数字是 3 。 + 对于 num1 中的数字 2 ,第二个数组中的下一个较大数字是 3 。 对于 num1 中的数字 4 ,第二个数组中没有下一个更大的数字,因此输出 -1 。 -  + 提示: nums1和nums2中所有元素是唯一的。 -nums1和nums2 的数组大小都不超过1000。 +nums1和nums2 的数组大小都不超过1000。 来源:力扣(LeetCode) diff --git "a/src/main/java/algorithm_practice/LeetCode/code400/H460_LFU\347\274\223\345\255\230.java" "b/src/main/java/algorithm_practice/LeetCode/code400/H460_LFU\347\274\223\345\255\230.java" index 8ee22946..57daca41 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code400/H460_LFU\347\274\223\345\255\230.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code400/H460_LFU\347\274\223\345\255\230.java" @@ -6,13 +6,13 @@ import java.util.HashMap; /* -设计并实现最不经常使用(LFU)缓存的数据结构。它应该支持以下操作:get 和 put。 +设计并实现最不经常使用(LFU)缓存的数据结构。它应该支持以下操作:get 和 put。 -get(key) - 如果键存在于缓存中,则获取键的值(总是正数),否则返回 -1。 -put(key, val) - 如果键不存在,请设置或插入值。当缓存达到其容量时,它应该在插入新项目之前,使最不经常使用的项目无效。在此问题中,当存在平局(即两个或更多个键具有相同使用频率)时,最近最少使用的键将被去除。 +get(key) - 如果键存在于缓存中,则获取键的值(总是正数),否则返回 -1。 +put(key, val) - 如果键不存在,请设置或插入值。当缓存达到其容量时,它应该在插入新项目之前,使最不经常使用的项目无效。在此问题中,当存在平局(即两个或更多个键具有相同使用频率)时,最近最少使用的键将被去除。 进阶: -你是否可以在 O(1) 时间复杂度内执行两项操作? +你是否可以在 O(1) 时间复杂度内执行两项操作? 示例: diff --git "a/src/main/java/algorithm_practice/LeetCode/code400/M402_\347\247\273\346\216\211K\344\275\215\346\225\260\345\255\227.java" "b/src/main/java/algorithm_practice/LeetCode/code400/M402_\347\247\273\346\216\211K\344\275\215\346\225\260\345\255\227.java" index 122f1fc2..bc0010d4 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code400/M402_\347\247\273\346\216\211K\344\275\215\346\225\260\345\255\227.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code400/M402_\347\247\273\346\216\211K\344\275\215\346\225\260\345\255\227.java" @@ -8,11 +8,11 @@ import java.util.Stack; /** - * 给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。 + * 给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。 *

* 注意: *

- * num 的长度小于 10002 且 ≥ k。 + * num 的长度小于 10002 且 ≥ k。 * num 不会包含任何前导零。 * 示例 1 : *

diff --git "a/src/main/java/algorithm_practice/LeetCode/code400/M406_\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.java" "b/src/main/java/algorithm_practice/LeetCode/code400/M406_\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.java" index f22d4ea0..0c3b8ccd 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code400/M406_\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code400/M406_\346\240\271\346\215\256\350\272\253\351\253\230\351\207\215\345\273\272\351\230\237\345\210\227.java" @@ -16,7 +16,7 @@ 输入:[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]] 输出:[[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]] -   + 提示: diff --git "a/src/main/java/algorithm_practice/LeetCode/code400/M416_\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.java" "b/src/main/java/algorithm_practice/LeetCode/code400/M416_\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.java" index abda1a72..459c5331 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code400/M416_\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code400/M416_\345\210\206\345\211\262\347\255\211\345\222\214\345\255\220\351\233\206.java" @@ -18,9 +18,9 @@ 输出: true 解释: 数组可以分割成 [1, 5, 5] 和 [11]. -  + -示例 2: +示例 2: 输入: [1, 2, 3, 5] diff --git "a/src/main/java/algorithm_practice/LeetCode/code400/M452_\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.java" "b/src/main/java/algorithm_practice/LeetCode/code400/M452_\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.java" index 625d3e43..9fcd836f 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code400/M452_\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code400/M452_\347\224\250\346\234\200\345\260\221\346\225\260\351\207\217\347\232\204\347\256\255\345\274\225\347\210\206\346\260\224\347\220\203.java" @@ -9,11 +9,11 @@ /* 在二维空间中有许多球形的气球。对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标。由于它是水平的,所以纵坐标并不重要,因此只要知道开始和结束的横坐标就足够了。开始坐标总是小于结束坐标。 -一支弓箭可以沿着 x 轴从不同点完全垂直地射出。在坐标 x 处射出一支箭,若有一个气球的直径的开始和结束坐标为 xstart,xend, 且满足  xstart ≤ x ≤ xend,则该气球会被引爆。可以射出的弓箭的数量没有限制。 弓箭一旦被射出之后,可以无限地前进。我们想找到使得所有气球全部被引爆,所需的弓箭的最小数量。 +一支弓箭可以沿着 x 轴从不同点完全垂直地射出。在坐标 x 处射出一支箭,若有一个气球的直径的开始和结束坐标为 xstart,xend, 且满足 xstart ≤ x ≤ xend,则该气球会被引爆。可以射出的弓箭的数量没有限制。 弓箭一旦被射出之后,可以无限地前进。我们想找到使得所有气球全部被引爆,所需的弓箭的最小数量。 给你一个数组 points ,其中 points [i] = [xstart,xend] ,返回引爆所有气球所必须射出的最小弓箭数。 -  + 示例 1: 输入:points = [[10,16],[2,8],[1,6],[7,12]] @@ -35,13 +35,13 @@ 输入:points = [[2,3],[2,3]] 输出:1 -  + 提示: 0 <= points.length <= 104 points[i].length == 2 --231 <= xstart < xend <= 231 - 1 +-231 <= xstart < xend <= 231 - 1 来源:力扣(LeetCode) diff --git "a/src/main/java/algorithm_practice/LeetCode/code400/M474_\344\270\200\345\222\214\351\233\266.java" "b/src/main/java/algorithm_practice/LeetCode/code400/M474_\344\270\200\345\222\214\351\233\266.java" index 795db5f7..33941b25 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code400/M474_\344\270\200\345\222\214\351\233\266.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code400/M474_\344\270\200\345\222\214\351\233\266.java" @@ -10,7 +10,7 @@ 如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 。 -  + 示例 1: @@ -23,13 +23,13 @@ 输入:strs = ["10", "0", "1"], m = 1, n = 1 输出:2 解释:最大的子集是 {"0", "1"} ,所以答案是 2 。 -  + 提示: 1 <= strs.length <= 600 1 <= strs[i].length <= 100 -strs[i] 仅由 '0' 和 '1' 组成 +strs[i] 仅由 '0' 和 '1' 组成 1 <= m, n <= 100 diff --git "a/src/main/java/algorithm_practice/LeetCode/code400/M494_\347\233\256\346\240\207\345\222\214.java" "b/src/main/java/algorithm_practice/LeetCode/code400/M494_\347\233\256\346\240\207\345\222\214.java" index 16bcc36c..172063cc 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code400/M494_\347\233\256\346\240\207\345\222\214.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code400/M494_\347\233\256\346\240\207\345\222\214.java" @@ -4,7 +4,7 @@ import org.junit.Test; /* -给定一个非负整数数组,a1, a2, ..., an, 和一个目标数,S。现在你有两个符号 + 和 -。对于数组中的任意一个整数,你都可以从 + 或 -中选择一个符号添加在前面。 +给定一个非负整数数组,a1, a2, ..., an, 和一个目标数,S。现在你有两个符号 + 和 -。对于数组中的任意一个整数,你都可以从 + 或 -中选择一个符号添加在前面。 返回可以使最终数组和为目标数 S 的所有添加符号的方法数。 diff --git "a/src/main/java/algorithm_practice/LeetCode/code500/H514_\350\207\252\347\224\261\344\271\213\350\267\257.java" "b/src/main/java/algorithm_practice/LeetCode/code500/H514_\350\207\252\347\224\261\344\271\213\350\267\257.java" index 5d9ac16f..dd5b6981 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code500/H514_\350\207\252\347\224\261\344\271\213\350\267\257.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code500/H514_\350\207\252\347\224\261\344\271\213\350\267\257.java" @@ -8,20 +8,20 @@ /* 电子游戏“辐射4”中,任务“通向自由”要求玩家到达名为“Freedom Trail Ring”的金属表盘,并使用表盘拼写特定关键词才能开门。 -给定一个字符串 ring,表示刻在外环上的编码;给定另一个字符串 key,表示需要拼写的关键词。您需要算出能够拼写关键词中所有字符的最少步数。 +给定一个字符串 ring,表示刻在外环上的编码;给定另一个字符串 key,表示需要拼写的关键词。您需要算出能够拼写关键词中所有字符的最少步数。 -最初,ring 的第一个字符与12:00方向对齐。您需要顺时针或逆时针旋转 ring 以使 key 的一个字符在 12:00 方向对齐,然后按下中心按钮,以此逐个拼写完 key 中的所有字符。 +最初,ring 的第一个字符与12:00方向对齐。您需要顺时针或逆时针旋转 ring 以使 key 的一个字符在 12:00 方向对齐,然后按下中心按钮,以此逐个拼写完 key 中的所有字符。 -旋转 ring 拼出 key 字符 key[i] 的阶段中: +旋转 ring 拼出 key 字符 key[i] 的阶段中: -您可以将 ring 顺时针或逆时针旋转一个位置,计为1步。旋转的最终目的是将字符串 ring 的一个字符与 12:00 方向对齐,并且这个字符必须等于字符 key[i] 。 -如果字符 key[i] 已经对齐到12:00方向,您需要按下中心按钮进行拼写,这也将算作 1 步。按完之后,您可以开始拼写 key 的下一个字符(下一阶段), 直至完成所有拼写。 +您可以将 ring 顺时针或逆时针旋转一个位置,计为1步。旋转的最终目的是将字符串 ring 的一个字符与 12:00 方向对齐,并且这个字符必须等于字符 key[i] 。 +如果字符 key[i] 已经对齐到12:00方向,您需要按下中心按钮进行拼写,这也将算作 1 步。按完之后,您可以开始拼写 key 的下一个字符(下一阶段), 直至完成所有拼写。 示例: -  + -  + 输入: ring = "godding", key = "gd" 输出: 4 解释: @@ -31,9 +31,9 @@ 因此最终的输出是 4。 提示: -ring 和 key 的字符串长度取值范围均为 1 至 100; +ring 和 key 的字符串长度取值范围均为 1 至 100; 两个字符串中都只有小写字符,并且均可能存在重复字符; -字符串 key 一定可以由字符串 ring 旋转拼出。 +字符串 key 一定可以由字符串 ring 旋转拼出。 来源:力扣(LeetCode) diff --git "a/src/main/java/algorithm_practice/LeetCode/code500/M516_\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.java" "b/src/main/java/algorithm_practice/LeetCode/code500/M516_\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.java" index ce119861..7ede6420 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code500/M516_\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code500/M516_\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\345\272\217\345\210\227.java" @@ -6,7 +6,7 @@ /* 给定一个字符串 s ,找到其中最长的回文子序列,并返回该序列的长度。可以假设 s 的最大长度为 1000 。 -  + 示例 1: 输入: @@ -26,7 +26,7 @@ 2 一个可能的最长回文子序列为 "bb"。 -  + 提示: diff --git "a/src/main/java/algorithm_practice/LeetCode/code500/M518_\351\233\266\351\222\261\345\205\221\346\215\2422.java" "b/src/main/java/algorithm_practice/LeetCode/code500/M518_\351\233\266\351\222\261\345\205\221\346\215\2422.java" index bcb3262c..7e831bb7 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code500/M518_\351\233\266\351\222\261\345\205\221\346\215\2422.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code500/M518_\351\233\266\351\222\261\345\205\221\346\215\2422.java" @@ -4,9 +4,9 @@ import org.junit.Test; /* -给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。  +给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。 -  + 示例 1: diff --git "a/src/main/java/algorithm_practice/LeetCode/code500/M547_\346\234\213\345\217\213\345\234\210.java" "b/src/main/java/algorithm_practice/LeetCode/code500/M547_\346\234\213\345\217\213\345\234\210.java" index dedebb03..b188b1cd 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code500/M547_\346\234\213\345\217\213\345\234\210.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code500/M547_\346\234\213\345\217\213\345\234\210.java" @@ -7,9 +7,9 @@ import java.util.Queue; /* -班上有 N 名学生。其中有些人是朋友,有些则不是。他们的友谊具有是传递性。如果已知 A 是 B 的朋友,B 是 C 的朋友,那么我们可以认为 A 也是 C 的朋友。所谓的朋友圈,是指所有朋友的集合。 +班上有 N 名学生。其中有些人是朋友,有些则不是。他们的友谊具有是传递性。如果已知 A 是 B 的朋友,B 是 C 的朋友,那么我们可以认为 A 也是 C 的朋友。所谓的朋友圈,是指所有朋友的集合。 -给定一个 N * N 的矩阵 M,表示班级中学生之间的朋友关系。如果M[i][j] = 1,表示已知第 i 个和 j 个学生互为朋友关系,否则为不知道。你必须输出所有学生中的已知的朋友圈总数。 +给定一个 N * N 的矩阵 M,表示班级中学生之间的朋友关系。如果M[i][j] = 1,表示已知第 i 个和 j 个学生互为朋友关系,否则为不知道。你必须输出所有学生中的已知的朋友圈总数。 示例 1: diff --git "a/src/main/java/algorithm_practice/LeetCode/code600/M695_\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.java" "b/src/main/java/algorithm_practice/LeetCode/code600/M695_\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.java" index 493afd17..040c59c6 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code600/M695_\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code600/M695_\345\262\233\345\261\277\347\232\204\346\234\200\345\244\247\351\235\242\347\247\257.java" @@ -4,7 +4,7 @@ import org.junit.Test; /* -给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合。你可以假设二维矩阵的四个边缘都被水包围着。 +给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合。你可以假设二维矩阵的四个边缘都被水包围着。 找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为0。) @@ -18,14 +18,14 @@ [0,0,0,0,0,0,0,0,0,0,1,0,0], [0,0,0,0,0,0,0,1,1,1,0,0,0], [0,0,0,0,0,0,0,1,1,0,0,0,0]] -对于上面这个给定矩阵应返回 6。注意答案不应该是11,因为岛屿只能包含水平或垂直的四个方向的‘1’。 +对于上面这个给定矩阵应返回 6。注意答案不应该是11,因为岛屿只能包含水平或垂直的四个方向的‘1’。 示例 2: [[0,0,0,0,0,0,0,0]] -对于上面这个给定的矩阵, 返回 0。 +对于上面这个给定的矩阵, 返回 0。 -注意: 给定的矩阵grid 的长度和宽度都不超过 50。 +注意: 给定的矩阵grid 的长度和宽度都不超过 50。 diff --git "a/src/main/java/algorithm_practice/LeetCode/code700/E704_\344\272\214\345\210\206\346\237\245\346\211\276.java" "b/src/main/java/algorithm_practice/LeetCode/code700/E704_\344\272\214\345\210\206\346\237\245\346\211\276.java" index b7255ffd..7199372e 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code700/E704_\344\272\214\345\210\206\346\237\245\346\211\276.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code700/E704_\344\272\214\345\210\206\346\237\245\346\211\276.java" @@ -4,7 +4,7 @@ import org.junit.Test; /* -给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。 +给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。 示例 1: @@ -12,18 +12,18 @@ 输入: nums = [-1,0,3,5,9,12], target = 9 输出: 4 解释: 9 出现在 nums 中并且下标为 4 -示例 2: +示例 2: 输入: nums = [-1,0,3,5,9,12], target = 2 输出: -1 解释: 2 不存在 nums 中因此返回 -1 -  + 提示: -你可以假设 nums 中的所有元素是不重复的。 -n 将在 [1, 10000]之间。 -nums 的每个元素都将在 [-9999, 9999]之间。 +你可以假设 nums 中的所有元素是不重复的。 +n 将在 [1, 10000]之间。 +nums 的每个元素都将在 [-9999, 9999]之间。 来源:力扣(LeetCode) diff --git "a/src/main/java/algorithm_practice/LeetCode/code700/M714_\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.java" "b/src/main/java/algorithm_practice/LeetCode/code700/M714_\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.java" index 33bc2f8c..5c63e89b 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code700/M714_\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code700/M714_\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272\345\220\253\346\211\213\347\273\255\350\264\271.java" @@ -4,7 +4,7 @@ import org.junit.Test; /* -给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 ;非负整数 fee 代表了交易股票的手续费用。 +给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 ;非负整数 fee 代表了交易股票的手续费用。 你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。 @@ -17,11 +17,11 @@ 输入: prices = [1, 3, 2, 8, 4, 9], fee = 2 输出: 8 解释: 能够达到的最大利润: -在此处买入 prices[0] = 1 +在此处买入 prices[0] = 1 在此处卖出 prices[3] = 8 在此处买入 prices[4] = 4 在此处卖出 prices[5] = 9 -总利润: ((8 - 1) - 2) + ((9 - 4) - 2) = 8. +总利润: ((8 - 1) - 2) + ((9 - 4) - 2) = 8. 注意: 0 < prices.length <= 50000. diff --git "a/src/main/java/algorithm_practice/LeetCode/code800/E876_\351\223\276\350\241\250\347\232\204\344\270\255\351\227\264\347\273\223\347\202\271.java" "b/src/main/java/algorithm_practice/LeetCode/code800/E876_\351\223\276\350\241\250\347\232\204\344\270\255\351\227\264\347\273\223\347\202\271.java" index 50ad96f5..9c2e07c5 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code800/E876_\351\223\276\350\241\250\347\232\204\344\270\255\351\227\264\347\273\223\347\202\271.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code800/E876_\351\223\276\350\241\250\347\232\204\344\270\255\351\227\264\347\273\223\347\202\271.java" @@ -10,11 +10,11 @@ import java.util.List; /* -给定一个带有头结点 head 的非空单链表,返回链表的中间结点。 +给定一个带有头结点 head 的非空单链表,返回链表的中间结点。 如果有两个中间结点,则返回第二个中间结点。 -  + 示例 1: @@ -23,16 +23,16 @@ 返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。 注意,我们返回了一个 ListNode 类型的对象 ans,这样: ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = NULL. -示例 2: +示例 2: 输入:[1,2,3,4,5,6] 输出:此列表中的结点 4 (序列化形式:[4,5,6]) 由于该列表有两个中间结点,值分别为 3 和 4,我们返回第二个结点。 -  + 提示: -给定链表的结点数介于 1 和 100 之间。 +给定链表的结点数介于 1 和 100 之间。 来源:力扣(LeetCode) diff --git "a/src/main/java/algorithm_practice/LeetCode/code800/H887_\351\270\241\350\233\213\346\216\211\350\220\275.java" "b/src/main/java/algorithm_practice/LeetCode/code800/H887_\351\270\241\350\233\213\346\216\211\350\220\275.java" index bcaf85c9..29281202 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code800/H887_\351\270\241\350\233\213\346\216\211\350\220\275.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code800/H887_\351\270\241\350\233\213\346\216\211\350\220\275.java" @@ -1,19 +1,19 @@ package algorithm_practice.LeetCode.code800; /* -你将获得 K 个鸡蛋,并可以使用一栋从 1 到 N  共有 N 层楼的建筑。 +你将获得 K 个鸡蛋,并可以使用一栋从 1 到 N 共有 N 层楼的建筑。 每个蛋的功能都是一样的,如果一个蛋碎了,你就不能再把它掉下去。 -你知道存在楼层 F ,满足 0 <= F <= N 任何从高于 F 的楼层落下的鸡蛋都会碎,从 F 楼层或比它低的楼层落下的鸡蛋都不会破。 +你知道存在楼层 F ,满足 0 <= F <= N 任何从高于 F 的楼层落下的鸡蛋都会碎,从 F 楼层或比它低的楼层落下的鸡蛋都不会破。 -每次移动,你可以取一个鸡蛋(如果你有完整的鸡蛋)并把它从任一楼层 X 扔下(满足 1 <= X <= N)。 +每次移动,你可以取一个鸡蛋(如果你有完整的鸡蛋)并把它从任一楼层 X 扔下(满足 1 <= X <= N)。 你的目标是确切地知道 F 的值是多少。 无论 F 的初始值如何,你确定 F 的值的最小移动次数是多少? -  + 示例 1: @@ -32,7 +32,7 @@ 输入:K = 3, N = 14 输出:4 -  + 提示: diff --git "a/src/main/java/algorithm_practice/LeetCode/code900/E905_\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204.java" "b/src/main/java/algorithm_practice/LeetCode/code900/E905_\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204.java" index a79d0988..b8736ae4 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code900/E905_\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code900/E905_\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\204.java" @@ -3,18 +3,18 @@ import org.junit.Test; /* -给定一个非负整数数组 A,返回一个数组,在该数组中, A 的所有偶数元素之后跟着所有奇数元素。 +给定一个非负整数数组 A,返回一个数组,在该数组中, A 的所有偶数元素之后跟着所有奇数元素。 你可以返回满足此条件的任何数组作为答案。 -  + 示例: 输入:[3,1,2,4] 输出:[2,4,3,1] 输出 [4,2,3,1],[2,4,1,3] 和 [4,2,1,3] 也会被接受。 -  + 提示: diff --git "a/src/main/java/algorithm_practice/LeetCode/code900/E922_\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\2042.java" "b/src/main/java/algorithm_practice/LeetCode/code900/E922_\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\2042.java" index f52c15f7..fa1bfbe0 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code900/E922_\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\2042.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code900/E922_\346\214\211\345\245\207\345\201\266\346\216\222\345\272\217\346\225\260\347\273\2042.java" @@ -1,20 +1,20 @@ package algorithm_practice.LeetCode.code900; /* -给定一个非负整数数组 A, A 中一半整数是奇数,一半整数是偶数。 +给定一个非负整数数组 A, A 中一半整数是奇数,一半整数是偶数。 -对数组进行排序,以便当 A[i] 为奇数时,i 也是奇数;当 A[i] 为偶数时, i 也是偶数。 +对数组进行排序,以便当 A[i] 为奇数时,i 也是奇数;当 A[i] 为偶数时, i 也是偶数。 你可以返回任何满足上述条件的数组作为答案。 -  + 示例: 输入:[4,2,5,7] 输出:[4,5,2,7] 解释:[4,7,2,5],[2,5,4,7],[2,7,4,5] 也会被接受。 -  + 提示: diff --git "a/src/main/java/algorithm_practice/LeetCode/code900/H980_\344\270\215\345\220\214\350\267\257\345\276\2043.java" "b/src/main/java/algorithm_practice/LeetCode/code900/H980_\344\270\215\345\220\214\350\267\257\345\276\2043.java" index 7270e390..ee22c0e7 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code900/H980_\344\270\215\345\220\214\350\267\257\345\276\2043.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code900/H980_\344\270\215\345\220\214\350\267\257\345\276\2043.java" @@ -14,7 +14,7 @@ 每一个无障碍方格都要通过一次,但是一条路径中不能重复通过同一个方格。 -  + 示例 1: @@ -39,7 +39,7 @@ 解释: 没有一条路能完全穿过每一个空的方格一次。 请注意,起始和结束方格可以位于网格中的任意位置。 -  + 提示: diff --git "a/src/main/java/algorithm_practice/LeetCode/code900/M912_\346\216\222\345\272\217\346\225\260\347\273\204.java" "b/src/main/java/algorithm_practice/LeetCode/code900/M912_\346\216\222\345\272\217\346\225\260\347\273\204.java" index 4abe034e..46359c9f 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code900/M912_\346\216\222\345\272\217\346\225\260\347\273\204.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code900/M912_\346\216\222\345\272\217\346\225\260\347\273\204.java" @@ -4,9 +4,9 @@ import org.junit.Test; /* -给你一个整数数组 nums,请你将该数组升序排列。 +给你一个整数数组 nums,请你将该数组升序排列。 -  + 示例 1: @@ -16,7 +16,7 @@ 输入:nums = [5,1,1,2,0,0] 输出:[0,0,1,1,2,5] -  + 提示: diff --git "a/src/main/java/algorithm_practice/LeetCode/code900/M945_\344\275\277\346\225\260\347\273\204\345\224\257\344\270\200\347\232\204\346\234\200\345\260\217\345\242\236\351\207\217.java" "b/src/main/java/algorithm_practice/LeetCode/code900/M945_\344\275\277\346\225\260\347\273\204\345\224\257\344\270\200\347\232\204\346\234\200\345\260\217\345\242\236\351\207\217.java" index 039a6830..877c0203 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code900/M945_\344\275\277\346\225\260\347\273\204\345\224\257\344\270\200\347\232\204\346\234\200\345\260\217\345\242\236\351\207\217.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code900/M945_\344\275\277\346\225\260\347\273\204\345\224\257\344\270\200\347\232\204\346\234\200\345\260\217\345\242\236\351\207\217.java" @@ -6,9 +6,9 @@ import java.util.Arrays; /* -给定整数数组 A,每次 move 操作将会选择任意 A[i],并将其递增 1。 +给定整数数组 A,每次 move 操作将会选择任意 A[i],并将其递增 1。 -返回使 A 中的每个值都是唯一的最少操作次数。 +返回使 A 中的每个值都是唯一的最少操作次数。 示例 1: diff --git "a/src/main/java/algorithm_practice/LeetCode/code900/M973_\346\234\200\346\216\245\350\277\221\345\216\237\347\202\271\347\232\204K\344\270\252\347\202\271.java" "b/src/main/java/algorithm_practice/LeetCode/code900/M973_\346\234\200\346\216\245\350\277\221\345\216\237\347\202\271\347\232\204K\344\270\252\347\202\271.java" index da5589f4..478f2061 100644 --- "a/src/main/java/algorithm_practice/LeetCode/code900/M973_\346\234\200\346\216\245\350\277\221\345\216\237\347\202\271\347\232\204K\344\270\252\347\202\271.java" +++ "b/src/main/java/algorithm_practice/LeetCode/code900/M973_\346\234\200\346\216\245\350\277\221\345\216\237\347\202\271\347\232\204K\344\270\252\347\202\271.java" @@ -16,7 +16,7 @@ 你可以按任何顺序返回答案。除了点坐标的顺序之外,答案确保是唯一的。 -  + 示例 1: @@ -32,7 +32,7 @@ 输入:points = [[3,3],[5,-1],[-2,4]], K = 2 输出:[[3,3],[-2,4]] (答案 [[-2,4],[3,3]] 也会被接受。) -  + 提示: diff --git a/src/main/java/common/datastruct/TreeNode.java b/src/main/java/common/datastruct/TreeNode.java index 22ac5427..10072fa5 100644 --- a/src/main/java/common/datastruct/TreeNode.java +++ b/src/main/java/common/datastruct/TreeNode.java @@ -12,6 +12,10 @@ public TreeNode(Integer val) { this.val = val; } + public TreeNode(String val) { + this.val = Integer.valueOf(val); + } + public TreeNode(Integer val, TreeNode left, TreeNode right) { this.val = val; this.left = left; diff --git a/src/main/java/common/util/CompareUtils.java b/src/main/java/common/util/CompareUtils.java index 2d8f1270..17911914 100644 --- a/src/main/java/common/util/CompareUtils.java +++ b/src/main/java/common/util/CompareUtils.java @@ -1,12 +1,30 @@ package common.util; import common.datastruct.ListNode; +import common.datastruct.TreeNode; /** * Created by nibnait on 2022/04/11 */ public class CompareUtils { + /** + * 正序排列 + */ + public static boolean isSortAsc(int[] arr) { + if (arr == null || arr.length < 2) { + return true; + } + + for (int i = 0; i < arr.length - 1; i++) { + if (arr[i] > arr[i + 1]) { + return false; + } + } + + return true; + } + /** * 对比两个链表 */ @@ -34,20 +52,35 @@ public static boolean compareDoubleListNode(ListNode left, ListNode right) { } /** - * 正序排列 + * 对比两棵二叉树 */ - public static boolean isSortAsc(int[] arr) { - if (arr == null || arr.length < 2) { + public static boolean isSameValueStructure(TreeNode head1, TreeNode head2) { + if (head1 == null && head2 != null) { + return false; + } + if (head1 != null && head2 == null) { + return false; + } + if (head1 == null && head2 == null) { return true; } - - for (int i = 0; i < arr.length - 1; i++) { - if (arr[i] > arr[i + 1]) { - return false; - } + if (head1.val != head2.val) { + return false; } + return isSameValueStructure(head1.left, head2.left) && isSameValueStructure(head1.right, head2.right); + } - return true; + /** + * 三目最大值 + */ + public static int max(int a, int b, int c) { + return Math.max(a, Math.max(b, c)); } + /** + * 三目最小值 + */ + public static int min(int a, int b, int c) { + return Math.min(a, Math.min(b, c)); + } } diff --git a/src/main/java/common/util/ConstructBinaryTree.java b/src/main/java/common/util/ConstructBinaryTree.java index 387fc1b1..a12595e1 100644 --- a/src/main/java/common/util/ConstructBinaryTree.java +++ b/src/main/java/common/util/ConstructBinaryTree.java @@ -3,11 +3,12 @@ import common.datastruct.TreeNode; import org.junit.Test; +import java.util.ArrayList; import java.util.LinkedList; -/* - 构造二叉树 - Created by nibnait on 2019-07-17 +/** + * 构造二叉树 + * Created by nibnait on 2019-07-17 */ public class ConstructBinaryTree { @@ -34,6 +35,9 @@ private static TreeNode constructByPreOrderArray(Integer[] preOrderArray, int st return head; } + /** + * 根据按层遍历的数组,生成一棵二叉树 + */ public static TreeNode constructByBFSArray(Integer[] bfsArray) { if (bfsArray == null || bfsArray.length == 0) { return null; @@ -65,6 +69,47 @@ public static TreeNode constructByBFSArray(Integer[] bfsArray) { return head; } + /** + * 生成一个随机树 + * @param maxLevel 指定最大的层数 + * @param maxValue 指定树里节点的最大值 + */ + public static TreeNode generateRandomBinaryTree(int maxLevel, int maxValue) { + return generate(1, maxLevel, maxValue); + } + + private static TreeNode generate(int level, int maxLevel, int maxValue) { + if (level > maxLevel || Math.random() < 0.5) { + return null; + } + TreeNode head = new TreeNode((int) (Math.random() * maxValue)); + head.left = generate(level + 1, maxLevel, maxValue); + head.right = generate(level + 1, maxLevel, maxValue); + return head; + } + + /** + * 随机 pick 树中的一个节点 + */ + public static TreeNode pickRandomOne(TreeNode head) { + if (head == null) { + return null; + } + ArrayList arr = new ArrayList<>(); + fillPrelist(head, arr); + int randomIndex = (int) (Math.random() * arr.size()); + return arr.get(randomIndex); + } + + private static void fillPrelist(TreeNode head, ArrayList arr) { + if (head == null) { + return; + } + arr.add(head); + fillPrelist(head.left, arr); + fillPrelist(head.right, arr); + } + @Test public void testCase() { Integer[] preOrderArray1 = {1, null, 2, 3}; diff --git a/src/main/java/common/util/PrintBinaryTree.java b/src/main/java/common/util/PrintBinaryTree.java index f6c11644..e06657be 100644 --- a/src/main/java/common/util/PrintBinaryTree.java +++ b/src/main/java/common/util/PrintBinaryTree.java @@ -6,7 +6,7 @@ /** * 打印二叉树 - * + *

* Created by nibnait on 2016/9/15. */ public class PrintBinaryTree { @@ -15,7 +15,7 @@ public class PrintBinaryTree { /** * ‘*’ 代表根结点 - * ‘~’ 代表左子结点 + * ‘^’ 代表左子结点 * ‘_’ 代表右子结点 * * @param head 树的根结点 @@ -28,17 +28,17 @@ public static void print(BinaryTreeNode head) { } private static void printInOrder(BinaryTreeNode head, int height, String to) { - if (head == null){ + if (head == null) { return; } - printInOrder(head.left, height+1, "~"); + printInOrder(head.left, height + 1, "^"); String val = to + head.value + to; int lenM = val.length(); int lenL = (NODE_LENGTH - lenM) / 2; int lenR = NODE_LENGTH - lenL - lenM; - val = getSpace(height*NODE_LENGTH + lenL) + val + getSpace(lenR); + val = getSpace(height * NODE_LENGTH + lenL) + val + getSpace(lenR); System.out.println(val); - printInOrder(head.right, height+1, "_"); + printInOrder(head.right, height + 1, "_"); } public static void print(TreeNode head) { @@ -48,19 +48,19 @@ public static void print(TreeNode head) { } private static void printInOrder(TreeNode head, int height, String to) { - if (head == null){ + if (head == null) { return; } - printInOrder(head.left, height+1, "~"); + printInOrder(head.left, height + 1, "^"); String val = to + head.val + to; int lenM = val.length(); int lenL = (NODE_LENGTH - lenM) / 2; int lenR = NODE_LENGTH - lenL - lenM; - val = getSpace(height*NODE_LENGTH + lenL) + val + getSpace(lenR); - if (!val.contains("null")){ + val = getSpace(height * NODE_LENGTH + lenL) + val + getSpace(lenR); + if (!val.contains("null")) { System.out.println(val); } - printInOrder(head.right, height+1, "_"); + printInOrder(head.right, height + 1, "_"); } private static String getSpace(int n) { @@ -71,6 +71,15 @@ private static String getSpace(int n) { return sb.toString(); } + public static void printPreOrder(TreeNode head) { + if (head == null) { + return; + } + System.out.print(head.val + ", "); + printPreOrder(head.left); + printPreOrder(head.right); + } + public static void main(String[] args) { BinaryTreeNode head = new BinaryTreeNode(1); head.left = new BinaryTreeNode(-222222222); diff --git "a/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c01xx_summary.md" "b/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c01xx_\344\270\200\344\272\233\350\266\205\347\272\247\345\237\272\347\241\200\347\232\204\347\256\227\346\263\225.md" similarity index 100% rename from "src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c01xx_summary.md" rename to "src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c01xx_\344\270\200\344\272\233\350\266\205\347\272\247\345\237\272\347\241\200\347\232\204\347\256\227\346\263\225.md" diff --git "a/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0201_\351\223\276\350\241\250/Code07_FindFirstIntersectListNode.java" "b/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0201_\351\223\276\350\241\250/Code07_FindFirstIntersectListNode.java" index b73fccd7..4c82557e 100644 --- "a/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0201_\351\223\276\350\241\250/Code07_FindFirstIntersectListNode.java" +++ "b/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0201_\351\223\276\350\241\250/Code07_FindFirstIntersectListNode.java" @@ -20,9 +20,45 @@ public void loopTestCase() { @Test public void testCase() { + // 1->2->3->4->5->6->7->null + ListNode head1 = new ListNode(1); + head1.next = new ListNode(2); + head1.next.next = new ListNode(3); + head1.next.next.next = new ListNode(4); + head1.next.next.next.next = new ListNode(5); + head1.next.next.next.next.next = new ListNode(6); + head1.next.next.next.next.next.next = new ListNode(7); + // 0->9->8->6->7->null + ListNode head2 = new ListNode(0); + head2.next = new ListNode(9); + head2.next.next = new ListNode(8); + head2.next.next.next = head1.next.next.next.next.next; // 8->6 + System.out.println(getIntersectListNode(head1, head2).val); + // 1->2->3->4->5->6->7->4... + head1 = new ListNode(1); + head1.next = new ListNode(2); + head1.next.next = new ListNode(3); + head1.next.next.next = new ListNode(4); + head1.next.next.next.next = new ListNode(5); + head1.next.next.next.next.next = new ListNode(6); + head1.next.next.next.next.next.next = new ListNode(7); + head1.next.next.next.next.next.next = head1.next.next.next; // 7->4 + // 0->9->8->2... + head2 = new ListNode(0); + head2.next = new ListNode(9); + head2.next.next = new ListNode(8); + head2.next.next.next = head1.next; // 8->2 + System.out.println(getIntersectListNode(head1, head2).val); + + // 0->9->8->6->4->5->6.. + head2 = new ListNode(0); + head2.next = new ListNode(9); + head2.next.next = new ListNode(8); + head2.next.next.next = head1.next.next.next.next.next; // 8->6 + System.out.println(getIntersectListNode(head1, head2).val); } @@ -30,6 +66,8 @@ public void testCase() { * 给定两个可能有环也可能无环的单链表,头节点head1和head2 * 请实现一个函数,如果两个链表相交,请返回相交的第一个节点。如果不相交返回null * 要求如果两个链表长度之和为N,时间复杂度请达到O(N),额外空间复杂度请达到O(1) + * + * https://leetcode.cn/problems/3u1WK4/ */ private ListNode getIntersectListNode(ListNode head1, ListNode head2) { if (head1 == null || head2 == null) { diff --git "a/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0203_\346\240\221/Code01_RecursiveTraversalBT.java" "b/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0203_\346\240\221/Code01_RecursiveTraversalBT.java" new file mode 100644 index 00000000..418f9b77 --- /dev/null +++ "b/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0203_\346\240\221/Code01_RecursiveTraversalBT.java" @@ -0,0 +1,111 @@ +package algorithmzuo.b_体系学习班.c0203_树; + +import com.google.common.collect.Lists; +import common.datastruct.TreeNode; +import common.util.PrintBinaryTree; +import io.github.nibnait.common.utils.compare.CompareUtils; +import lombok.extern.slf4j.Slf4j; +import org.junit.Assert; +import org.junit.Test; + +import java.util.List; + +/** + * Created by nibnait on 2022/10/27 + */ +@Slf4j +public class Code01_RecursiveTraversalBT { + + @Test + public void testCase() { + TreeNode head = new TreeNode(5); + head.left = new TreeNode(3); + head.right = new TreeNode(8); + head.left.left = new TreeNode(2); + head.left.right = new TreeNode(4); + head.left.left.left = new TreeNode(1); + head.right.left = new TreeNode(7); + head.right.left.left = new TreeNode(6); + head.right.right = new TreeNode(10); + head.right.right.left = new TreeNode(9); + head.right.right.right = new TreeNode(11); + + PrintBinaryTree.print(head); + + List preOrderArr = preOrderRecur(head); + List expectPreOrderArr = Lists.newArrayList(5, 3, 2, 1, 4, 8, 7, 6, 10, 9, 11); + Assert.assertTrue(CompareUtils.match(preOrderArr, expectPreOrderArr)); + + List inOrderArr = inOrderRecur(head); + List expectInOrderArr = Lists.newArrayList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11); + Assert.assertTrue(CompareUtils.match(inOrderArr, expectInOrderArr)); + + List posOrderArr = posOrderRecur(head); + List expectPosOrderArr = Lists.newArrayList(1, 2, 4, 3, 6, 7, 9, 11, 10, 8, 5); + Assert.assertTrue(CompareUtils.match(posOrderArr, expectPosOrderArr)); + + } + + /** + * 先序 + */ + private List preOrderRecur(TreeNode head) { + List travelArr = Lists.newArrayList(); + if (head == null) { + return travelArr; + } + + processPreOrder(head, travelArr); + return travelArr; + } + + private void processPreOrder(TreeNode head, List travelArr) { + if (head == null) { + return; + } + + travelArr.add(head.val); + processPreOrder(head.left, travelArr); + processPreOrder(head.right, travelArr); + } + + private List inOrderRecur(TreeNode head) { + List travelArr = Lists.newArrayList(); + if (head == null) { + return travelArr; + } + + processInOrder(head, travelArr); + return travelArr; + } + + private void processInOrder(TreeNode head, List travelArr) { + if (head == null) { + return; + } + + processInOrder(head.left, travelArr); + travelArr.add(head.val); + processInOrder(head.right, travelArr); + } + + private List posOrderRecur(TreeNode head) { + List travelArr = Lists.newArrayList(); + if (head == null) { + return travelArr; + } + + processPosOrder(head, travelArr); + return travelArr; + } + + private void processPosOrder(TreeNode head, List travelArr) { + if (head == null) { + return; + } + + processPosOrder(head.left, travelArr); + processPosOrder(head.right, travelArr); + travelArr.add(head.val); + } +} diff --git "a/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0203_\346\240\221/Code02_UnRecursiveTraversalBT.java" "b/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0203_\346\240\221/Code02_UnRecursiveTraversalBT.java" new file mode 100644 index 00000000..6bebb0e7 --- /dev/null +++ "b/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0203_\346\240\221/Code02_UnRecursiveTraversalBT.java" @@ -0,0 +1,117 @@ +package algorithmzuo.b_体系学习班.c0203_树; + +import com.google.common.collect.Lists; +import common.datastruct.TreeNode; +import common.util.PrintBinaryTree; +import io.github.nibnait.common.utils.compare.CompareUtils; +import lombok.extern.slf4j.Slf4j; +import org.junit.Assert; +import org.junit.Test; + +import java.util.List; +import java.util.Stack; + +/** + * Created by nibnait on 2022/10/27 + */ +@Slf4j +public class Code02_UnRecursiveTraversalBT { + + @Test + public void testCase() { + TreeNode head = new TreeNode(5); + head.left = new TreeNode(3); + head.right = new TreeNode(8); + head.left.left = new TreeNode(2); + head.left.right = new TreeNode(4); + head.left.left.left = new TreeNode(1); + head.right.left = new TreeNode(7); + head.right.left.left = new TreeNode(6); + head.right.right = new TreeNode(10); + head.right.right.left = new TreeNode(9); + head.right.right.right = new TreeNode(11); + + PrintBinaryTree.print(head); + + List preOrderArr = preOrderUnRecur(head); + List expectPreOrderArr = Lists.newArrayList(5, 3, 2, 1, 4, 8, 7, 6, 10, 9, 11); + Assert.assertTrue(CompareUtils.match(preOrderArr, expectPreOrderArr)); + + List inOrderArr = inOrderUnRecur(head); + List expectInOrderArr = Lists.newArrayList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11); + Assert.assertTrue(CompareUtils.match(inOrderArr, expectInOrderArr)); + + List posOrderArr = posOrderUnRecur(head); + List expectPosOrderArr = Lists.newArrayList(1, 2, 4, 3, 6, 7, 9, 11, 10, 8, 5); + Assert.assertTrue(CompareUtils.match(posOrderArr, expectPosOrderArr)); + + } + + private List preOrderUnRecur(TreeNode head) { + List travelArr = Lists.newArrayList(); + if (head == null) { + return travelArr; + } + + Stack stack = new Stack<>(); + travelArr.add(head.val); + stack.push(head.right); + stack.push(head.left); + + while (!stack.isEmpty()) { + head = stack.pop(); + if (head == null) { + continue; + } + travelArr.add(head.val); + stack.push(head.right); + stack.push(head.left); + } + + return travelArr; + } + + /** + * 所有的左子树,组成了这一棵二叉树 + */ + private List inOrderUnRecur(TreeNode head) { + List travelArr = Lists.newArrayList(); + if (head == null) { + return travelArr; + } + + Stack stack = new Stack<>(); + while (head != null) { + stack.push(head); + head = head.left; + } + + while (!stack.isEmpty()) { + head = stack.pop(); + travelArr.add(head.val); + if (head.right != null) { + head = head.right; + + while (head != null) { + stack.push(head); + head = head.left; + } + } + + } + return travelArr; + } + + private List posOrderUnRecur(TreeNode head) { + List travelArr = Lists.newArrayList(); + if (head == null) { + return travelArr; + } + + + + + return travelArr; + } + +} diff --git "a/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0203_\346\240\221/Code03_LevelTraversalBT.java" "b/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0203_\346\240\221/Code03_LevelTraversalBT.java" new file mode 100644 index 00000000..de00cfb8 --- /dev/null +++ "b/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0203_\346\240\221/Code03_LevelTraversalBT.java" @@ -0,0 +1,67 @@ +package algorithmzuo.b_体系学习班.c0203_树; + +import com.google.common.collect.Lists; +import common.datastruct.TreeNode; +import common.util.PrintBinaryTree; +import io.github.nibnait.common.utils.compare.CompareUtils; +import lombok.extern.slf4j.Slf4j; +import org.junit.Assert; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.Queue; + +/** + * Created by nibnait on 2022/10/27 + */ +@Slf4j +public class Code03_LevelTraversalBT { + + @Test + public void testCase() { + TreeNode head = new TreeNode(5); + head.left = new TreeNode(3); + head.right = new TreeNode(8); + head.left.left = new TreeNode(2); + head.left.right = new TreeNode(4); + head.left.left.left = new TreeNode(1); + head.right.left = new TreeNode(7); + head.right.left.left = new TreeNode(6); + head.right.right = new TreeNode(10); + head.right.right.left = new TreeNode(9); + head.right.right.right = new TreeNode(11); + + PrintBinaryTree.print(head); + + List levelOrderArr = levelTravel(head); + List expectOrderArr = Lists.newArrayList(5, 3, 8, 2, 4, 7, 10, 1, 6, 9, 11); + Assert.assertTrue(CompareUtils.match(levelOrderArr, expectOrderArr)); + } + + private List levelTravel(TreeNode head) { + List travelArr = new ArrayList<>(); + if (head == null) { + return travelArr; + } + + Queue queue = new LinkedList<>(); + queue.offer(head); + + while (!queue.isEmpty()) { + head = queue.poll(); + travelArr.add(head.val); + + if (head.left != null) { + queue.offer(head.left); + } + if (head.right != null) { + queue.offer(head.right); + } + } + + return travelArr; + } + +} diff --git "a/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0203_\346\240\221/Code04_SerializeAndReconstructTree.java" "b/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0203_\346\240\221/Code04_SerializeAndReconstructTree.java" new file mode 100644 index 00000000..9def42e8 --- /dev/null +++ "b/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0203_\346\240\221/Code04_SerializeAndReconstructTree.java" @@ -0,0 +1,24 @@ +package algorithmzuo.b_体系学习班.c0203_树; + +import common.datastruct.TreeNode; + +import java.util.Queue; + +/** + * Created by nibnait on 2022/10/27 + */ +public interface Code04_SerializeAndReconstructTree { + + Queue preSerial(TreeNode head); + + Queue posSerial(TreeNode head); + + Queue levelSerial(TreeNode head); + + TreeNode buildByPreQueue(Queue pre); + + TreeNode buildByPosQueue(Queue pos); + + TreeNode buildByLevelQueue(Queue level); + +} diff --git "a/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0203_\346\240\221/Code04_SerializeAndReconstructTreeImpl.java" "b/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0203_\346\240\221/Code04_SerializeAndReconstructTreeImpl.java" new file mode 100644 index 00000000..6015b9f5 --- /dev/null +++ "b/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0203_\346\240\221/Code04_SerializeAndReconstructTreeImpl.java" @@ -0,0 +1,192 @@ +package algorithmzuo.b_体系学习班.c0203_树; + +import common.CommonConstants; +import common.datastruct.TreeNode; +import common.util.*; +import lombok.extern.slf4j.Slf4j; +import org.junit.Assert; +import org.junit.Test; + +import java.util.LinkedList; +import java.util.Queue; +import java.util.Stack; + +/** + * Created by nibnait on 2022/10/27 + */ +@Slf4j +public class Code04_SerializeAndReconstructTreeImpl implements Code04_SerializeAndReconstructTree { + + @Test + public void loopTestCase() { + for (int i = 0; i < CommonConstants.TEST_CASE_COUNT_1000; i++) { + testCase(); + } + } + + @Test + public void testCase() { + int maxLevel = SysRandom.randomInt(1, 6); + int maxValue = SysRandom.random(100); + + TreeNode head = ConstructBinaryTree.generateRandomBinaryTree(maxLevel, maxValue); + PrintBinaryTree.print(head); + SysOut.printSeparator(); + + Queue pre = preSerial(head); + Queue pos = posSerial(head); + Queue level = levelSerial(head); + TreeNode preBuild = buildByPreQueue(pre); + TreeNode posBuild = buildByPosQueue(pos); + TreeNode levelBuild = buildByLevelQueue(level); + + Assert.assertTrue(CompareUtils.isSameValueStructure(head, preBuild)); + Assert.assertTrue(CompareUtils.isSameValueStructure(preBuild, posBuild)); + Assert.assertTrue(CompareUtils.isSameValueStructure(posBuild, levelBuild)); + } + + private static final String NULL_HEAD = "#"; + + @Override + public Queue preSerial(TreeNode head) { + Queue travelArr = new LinkedList<>(); + if (head == null) { + return travelArr; + } + + processPreSerial(head, travelArr); + return travelArr; + } + + private void processPreSerial(TreeNode head, Queue travelArr) { + if (head == null) { + travelArr.add(NULL_HEAD); + } else { + travelArr.add(String.valueOf(head.val)); + processPreSerial(head.left, travelArr); + processPreSerial(head.right, travelArr); + } + } + + @Override + public Queue posSerial(TreeNode head) { + Queue travelArr = new LinkedList<>(); + if (head == null) { + return travelArr; + } + processPosSerial(head, travelArr); + return travelArr; + } + + private void processPosSerial(TreeNode head, Queue travelArr) { + if (head == null) { + travelArr.add(NULL_HEAD); + } else { + processPosSerial(head.left, travelArr); + processPosSerial(head.right, travelArr); + travelArr.add(String.valueOf(head.val)); + } + } + + @Override + public Queue levelSerial(TreeNode head) { + Queue travelArr = new LinkedList<>(); + if (head == null) { + travelArr.add(NULL_HEAD); + } else { + travelArr.add(String.valueOf(head.val)); + Queue queue = new LinkedList<>(); + travelArr.add(String.valueOf(head.val)); + queue.add(head); + while (!queue.isEmpty()) { + if (head.left != null) { + queue.add(head.left); + travelArr.add(String.valueOf(head.left.val)); + } else { + travelArr.add(NULL_HEAD); + } + + if (head.right != null) { + queue.add(head.right); + travelArr.add(String.valueOf(head.right.val)); + } else { + travelArr.add(NULL_HEAD); + } + } + } + return travelArr; + } + + @Override + public TreeNode buildByPreQueue(Queue pre) { + if (pre == null || pre.isEmpty()) { + return null; + } + return processBuildByPreQueue(pre); + } + + private TreeNode processBuildByPreQueue(Queue pre) { + String headVal = pre.poll(); + if (NULL_HEAD.equals(headVal)) { + return null; + } + TreeNode head = new TreeNode(headVal); + head.left = processBuildByPreQueue(pre); + head.right = processBuildByPreQueue(pre); + return head; + } + + @Override + public TreeNode buildByPosQueue(Queue pos) { + if (pos == null || pos.isEmpty()) { + return null; + } + + // 左右中 -> 中右左 + Stack stack = new Stack(); + while (!pos.isEmpty()) { + stack.push(pos.poll()); + } + return processBuildByPosQueue(stack); + } + + private TreeNode processBuildByPosQueue(Stack stack) { + String headVal = stack.pop(); + TreeNode head = new TreeNode(headVal); + head.right = processBuildByPosQueue(stack); + head.left = processBuildByPosQueue(stack); + return head; + } + + @Override + public TreeNode buildByLevelQueue(Queue level) { + if (level == null || level.isEmpty()) { + return null; + } + TreeNode head = generateNode(level.poll()); + Queue queue = new LinkedList<>(); + if (head != null) { + queue.add(head); + } + while (!queue.isEmpty()) { + head = queue.poll(); + head.left = generateNode(level.poll()); + head.right = generateNode(level.poll()); + if (head.left != null) { + queue.add(head.left); + } + if (head.right != null) { + queue.add(head.right); + } + } + return head; + } + + private TreeNode generateNode(String headVal) { + if (headVal == null || NULL_HEAD.equals(headVal)) { + return null; + } + return new TreeNode(headVal); + } + +} diff --git "a/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0203_\346\240\221/Code05_EncodeNaryTreeToBinaryTree.java" "b/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0203_\346\240\221/Code05_EncodeNaryTreeToBinaryTree.java" new file mode 100644 index 00000000..a1ab4eef --- /dev/null +++ "b/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0203_\346\240\221/Code05_EncodeNaryTreeToBinaryTree.java" @@ -0,0 +1,19 @@ +package algorithmzuo.b_体系学习班.c0203_树; + +import org.junit.Test; + +/** + * Created by nibnait on 2022/10/27 + */ +public class Code05_EncodeNaryTreeToBinaryTree { + + @Test + public void test() { + + } + + /** + * N叉树如何通过二叉树来序列化、并完成反序列化 + * https://leetcode.com/problems/encode-n-ary-tree-to-binary-tree + */ +} diff --git "a/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0203_\346\240\221/Code06_TreeMaxWidth.java" "b/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0203_\346\240\221/Code06_TreeMaxWidth.java" new file mode 100644 index 00000000..dcae9514 --- /dev/null +++ "b/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0203_\346\240\221/Code06_TreeMaxWidth.java" @@ -0,0 +1,85 @@ +package algorithmzuo.b_体系学习班.c0203_树; + +import common.CommonConstants; +import common.datastruct.TreeNode; +import common.util.ConstructBinaryTree; +import common.util.PrintBinaryTree; +import common.util.SysOut; +import common.util.SysRandom; +import org.junit.Assert; +import org.junit.Test; + +import java.util.HashMap; +import java.util.LinkedList; +import java.util.Queue; + +/** + * Created by nibnait on 2022/10/30 + */ +public class Code06_TreeMaxWidth { + + @Test + public void loopTestCase() { + for (int i = 0; i < CommonConstants.TEST_CASE_COUNT_1000; i++) { + testCase(); + } + } + + @Test + public void testCase() { + int maxLevel = SysRandom.randomInt(1, 10); + int maxValue = SysRandom.random(100); + + TreeNode head = ConstructBinaryTree.generateRandomBinaryTree(maxLevel, maxValue); + PrintBinaryTree.print(head); + SysOut.printSeparator(); + + int result = maxWidth(head); + + Assert.assertEquals(comparator(head), result); + + } + + /** + * 求二叉树的最大宽度 + */ + private int maxWidth(TreeNode head) { + return 0; + } + + //-------------------------- 对数器 --------------------------// + private int comparator(TreeNode head) { + if (head == null) { + return 0; + } + Queue queue = new LinkedList<>(); + queue.add(head); + // key 在 哪一层,value + HashMap levelMap = new HashMap<>(); + levelMap.put(head, 1); + int curLevel = 1; // 当前你正在统计哪一层的宽度 + int curLevelNodes = 0; // 当前层curLevel层,宽度目前是多少 + int max = 0; + while (!queue.isEmpty()) { + TreeNode cur = queue.poll(); + int curNodeLevel = levelMap.get(cur); + if (cur.left != null) { + levelMap.put(cur.left, curNodeLevel + 1); + queue.add(cur.left); + } + if (cur.right != null) { + levelMap.put(cur.right, curNodeLevel + 1); + queue.add(cur.right); + } + if (curNodeLevel == curLevel) { + curLevelNodes++; + } else { + max = Math.max(max, curLevelNodes); + curLevel++; + curLevelNodes = 1; + } + } + max = Math.max(max, curLevelNodes); + return max; + } +} diff --git "a/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0204_\346\240\221\345\236\213DP/Code01_IsBalanced.java" "b/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0204_\346\240\221\345\236\213DP/Code01_IsBalanced.java" new file mode 100644 index 00000000..800b7134 --- /dev/null +++ "b/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0204_\346\240\221\345\236\213DP/Code01_IsBalanced.java" @@ -0,0 +1,85 @@ +package algorithmzuo.b_体系学习班.c0204_树型DP; + +import common.CommonConstants; +import common.datastruct.TreeNode; +import common.util.ConstructBinaryTree; +import common.util.SysRandom; +import lombok.AllArgsConstructor; +import org.junit.Assert; +import org.junit.Test; + +public class Code01_IsBalanced { + + @Test + public void loopTestCase() { + for (int i = 0; i < CommonConstants.TEST_CASE_COUNT_1000; i++) { + testCase(); + } + } + + @Test + public void testCase() { + int maxLevel = SysRandom.randomInt(0, 6); + int maxValue = SysRandom.random(100); + + TreeNode head = ConstructBinaryTree.generateRandomBinaryTree(maxLevel, maxValue); +// PrintBinaryTree.print(head); +// PrintBinaryTree.printPreOrder(head); + + boolean result = isBalanced(head); + + Assert.assertEquals(comparator(head), result); + } + + /** + * 判断二叉树是不是平衡二叉树 + * 即:任何一棵子树的 | 左高度 - 右高度 | <= 1 + */ + private boolean isBalanced(TreeNode head) { + if (head == null) { + return true; + } + + return process(head).isBalance; + } + + private Info process(TreeNode head) { + if (head == null) { + return new Info(0, true); + } + + Info left = process(head.left); + Info right = process(head.right); + + int height = Math.max(left.height, right.height) + 1; + boolean isBalance = left.isBalance && right.isBalance && Math.abs(left.height - right.height) <= 1; + return new Info(height, isBalance); + } + + @AllArgsConstructor + private class Info { + public int height; + public boolean isBalance; + } + + //-------------------------- 对数器 --------------------------// + private boolean comparator(TreeNode head) { + boolean[] ans = new boolean[1]; + ans[0] = true; + process1(head, ans); + return ans[0]; + } + + private int process1(TreeNode head, boolean[] ans) { + if (!ans[0] || head == null) { + return -1; + } + int leftHeight = process1(head.left, ans); + int rightHeight = process1(head.right, ans); + if (Math.abs(leftHeight - rightHeight) > 1) { + ans[0] = false; + } + return Math.max(leftHeight, rightHeight) + 1; + } + +} diff --git "a/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0204_\346\240\221\345\236\213DP/Code02_IsBST.java" "b/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0204_\346\240\221\345\236\213DP/Code02_IsBST.java" new file mode 100644 index 00000000..34bc6c95 --- /dev/null +++ "b/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0204_\346\240\221\345\236\213DP/Code02_IsBST.java" @@ -0,0 +1,110 @@ +package algorithmzuo.b_体系学习班.c0204_树型DP; + +import common.CommonConstants; +import common.datastruct.TreeNode; +import common.util.*; +import lombok.AllArgsConstructor; +import org.junit.Assert; +import org.junit.Test; + +import java.util.ArrayList; + +/** + * Created by nibnait on 2022/10/28 + */ +public class Code02_IsBST { + + @Test + public void loopTestCase() { + for (int i = 0; i < CommonConstants.TEST_CASE_COUNT_1000; i++) { + testCase(); + } + } + + @Test + public void testCase() { + int maxLevel = SysRandom.randomInt(1, 6); + int maxValue = SysRandom.random(100); + + TreeNode head = ConstructBinaryTree.generateRandomBinaryTree(maxLevel, maxValue); +// PrintBinaryTree.print(head); +// SysOut.printSeparator(); + + boolean result = isBST(head); + + Assert.assertEquals(comparator(head), result); + } + + /** + * 判断二叉树是不是搜索二叉树(整棵树无重复节点) + * 即:任何一棵子树。都是搜索二叉树 + */ + private boolean isBST(TreeNode head) { + if (head == null) { + return true; + } + return process(head).isBST; + } + + private Info process(TreeNode head) { + if (head == null) { + return null; + } + + Info left = process(head.left); + Info right = process(head.right); + + int max = CompareUtils.max(head.val, + left != null ? left.max : Integer.MIN_VALUE, + right != null ? right.max : Integer.MIN_VALUE); + int min = CompareUtils.min(head.val, + left != null ? left.min : Integer.MAX_VALUE, + right != null ? right.min : Integer.MAX_VALUE); + + boolean isBST = true; + if (left != null && !left.isBST) { + isBST = false; + } + if (right != null && !right.isBST) { + isBST = false; + } + if (left != null && left.max >= head.val) { + isBST = false; + } + if (right != null && right.min <= head.val) { + isBST = false; + } + return new Info(max, min, isBST); + } + + @AllArgsConstructor + private class Info { + public int max; + public int min; + public boolean isBST; + } + + //-------------------------- 对数器 --------------------------// + private boolean comparator(TreeNode head) { + if (head == null) { + return true; + } + ArrayList arr = new ArrayList<>(); + in(head, arr); + for (int i = 1; i < arr.size(); i++) { + if (arr.get(i).val <= arr.get(i - 1).val) { + return false; + } + } + return true; + } + + public static void in(TreeNode head, ArrayList arr) { + if (head == null) { + return; + } + in(head.left, arr); + arr.add(head); + in(head.right, arr); + } +} diff --git "a/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0204_\346\240\221\345\236\213DP/Code03_MaxDistance.java" "b/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0204_\346\240\221\345\236\213DP/Code03_MaxDistance.java" new file mode 100644 index 00000000..293bfa36 --- /dev/null +++ "b/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0204_\346\240\221\345\236\213DP/Code03_MaxDistance.java" @@ -0,0 +1,131 @@ +package algorithmzuo.b_体系学习班.c0204_树型DP; + +import common.CommonConstants; +import common.datastruct.TreeNode; +import common.util.*; +import lombok.AllArgsConstructor; +import org.junit.Assert; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; + +/** + * Created by nibnait on 2022/10/29 + */ +public class Code03_MaxDistance { + + @Test + public void loopTestCase() { + for (int i = 0; i < CommonConstants.TEST_CASE_COUNT_1000; i++) { + testCase(); + } + } + + @Test + public void testCase() { + int maxLevel = SysRandom.randomInt(1, 6); + int maxValue = SysRandom.random(100); + + TreeNode head = ConstructBinaryTree.generateRandomBinaryTree(maxLevel, maxValue); + PrintBinaryTree.print(head); + SysOut.printSeparator(); + + int result = maxDistance(head); + + Assert.assertEquals(comparator(head), result); + } + + /** + * 给定一棵二叉树的头节点head,任何两个节点之间都存在距离,返回整棵二叉树的最大距离 + */ + private int maxDistance(TreeNode head) { + if (head == null) { + return 0; + } + return 0; + } + + @AllArgsConstructor + private class Info { + + } + + //-------------------------- 对数器 --------------------------// + private int comparator(TreeNode head) { + if (head == null) { + return 0; + } + ArrayList arr = getPrelist(head); + HashMap parentMap = getParentMap(head); + int max = 0; + for (int i = 0; i < arr.size(); i++) { + for (int j = i; j < arr.size(); j++) { + max = Math.max(max, distance(parentMap, arr.get(i), arr.get(j))); + } + } + return max; + } + + public static ArrayList getPrelist(TreeNode head) { + ArrayList arr = new ArrayList<>(); + fillPrelist(head, arr); + return arr; + } + + public static void fillPrelist(TreeNode head, ArrayList arr) { + if (head == null) { + return; + } + arr.add(head); + fillPrelist(head.left, arr); + fillPrelist(head.right, arr); + } + + public static HashMap getParentMap(TreeNode head) { + HashMap map = new HashMap<>(); + map.put(head, null); + fillParentMap(head, map); + return map; + } + + public static void fillParentMap(TreeNode head, HashMap parentMap) { + if (head.left != null) { + parentMap.put(head.left, head); + fillParentMap(head.left, parentMap); + } + if (head.right != null) { + parentMap.put(head.right, head); + fillParentMap(head.right, parentMap); + } + } + + public static int distance(HashMap parentMap, TreeNode o1, TreeNode o2) { + HashSet o1Set = new HashSet<>(); + TreeNode cur = o1; + o1Set.add(cur); + while (parentMap.get(cur) != null) { + cur = parentMap.get(cur); + o1Set.add(cur); + } + cur = o2; + while (!o1Set.contains(cur)) { + cur = parentMap.get(cur); + } + TreeNode lowestAncestor = cur; + cur = o1; + int distance1 = 1; + while (cur != lowestAncestor) { + cur = parentMap.get(cur); + distance1++; + } + cur = o2; + int distance2 = 1; + while (cur != lowestAncestor) { + cur = parentMap.get(cur); + distance2++; + } + return distance1 + distance2 - 1; + } +} diff --git "a/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0204_\346\240\221\345\236\213DP/Code04_IsFull.java" "b/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0204_\346\240\221\345\236\213DP/Code04_IsFull.java" new file mode 100644 index 00000000..e3b4c31a --- /dev/null +++ "b/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0204_\346\240\221\345\236\213DP/Code04_IsFull.java" @@ -0,0 +1,95 @@ +package algorithmzuo.b_体系学习班.c0204_树型DP; + +import common.CommonConstants; +import common.datastruct.TreeNode; +import common.util.ConstructBinaryTree; +import common.util.PrintBinaryTree; +import common.util.SysOut; +import common.util.SysRandom; +import lombok.AllArgsConstructor; +import org.junit.Assert; +import org.junit.Test; + +/** + * Created by nibnait on 2022/10/29 + */ +public class Code04_IsFull { + + @Test + public void loopTestCase() { + for (int i = 0; i < CommonConstants.TEST_CASE_COUNT_1000; i++) { + testCase(); + } + } + + @Test + public void testCase() { + int maxLevel = SysRandom.randomInt(1, 6); + int maxValue = SysRandom.random(100); + + TreeNode head = ConstructBinaryTree.generateRandomBinaryTree(maxLevel, maxValue); + PrintBinaryTree.print(head); + SysOut.printSeparator(); + + Assert.assertEquals(isFull1(head), isFull2(head)); + } + + /** + * 判断二叉树是不是满二叉树 + */ + private boolean isFull1(TreeNode head) { + if (head == null) { + return true; + } + return process1(head).isFull; + } + + private Info1 process1(TreeNode head) { + if (head == null) { + return new Info1(true, 0); + } + + Info1 left = process1(head.left); + Info1 right = process1(head.right); + + boolean isFull = left.isFull && right.isFull && left.height == right.height; + int height = Math.max(left.height, right.height) + 1; + + return new Info1(isFull, height); + } + + @AllArgsConstructor + private class Info1 { + public boolean isFull; + public int height; + } + + /** + * 法2: 只有满二叉树满足 : 2 ^ h - 1 == n + */ + private boolean isFull2(TreeNode head) { + if (head == null) { + return true; + } + Info2 headInfo = process2(head); + return headInfo.size == Math.pow(2, headInfo.height) - 1; + } + + private Info2 process2(TreeNode head) { + if (head == null) { + return new Info2(0, 0); + } + Info2 left = process2(head.left); + Info2 right = process2(head.right); + + int size = left.size + right.size + 1; + int height = Math.max(left.height, right.height) + 1; + return new Info2(size, height); + } + + @AllArgsConstructor + private class Info2 { + public int size; + public int height; + } +} diff --git "a/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0204_\346\240\221\345\236\213DP/Code05_MaxSubBSTSize.java" "b/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0204_\346\240\221\345\236\213DP/Code05_MaxSubBSTSize.java" new file mode 100644 index 00000000..98b9bbf5 --- /dev/null +++ "b/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0204_\346\240\221\345\236\213DP/Code05_MaxSubBSTSize.java" @@ -0,0 +1,87 @@ +package algorithmzuo.b_体系学习班.c0204_树型DP; + +import common.CommonConstants; +import common.datastruct.TreeNode; +import common.util.ConstructBinaryTree; +import common.util.SysRandom; +import lombok.AllArgsConstructor; +import org.junit.Test; + +import java.util.ArrayList; + +/** + * Created by nibnait on 2022/10/29 + */ +public class Code05_MaxSubBSTSize { + + @Test + public void loopTestCase() { + for (int i = 0; i < CommonConstants.TEST_CASE_COUNT_1000; i++) { + testCase(); + } + } + + @Test + public void testCase() { + int maxLevel = SysRandom.randomInt(1, 6); + int maxValue = SysRandom.random(100); + + TreeNode head = ConstructBinaryTree.generateRandomBinaryTree(maxLevel, maxValue); +// PrintBinaryTree.print(head); +// SysOut.printSeparator(); + + int result = maxSubBSTSize(head); + +// Assert.assertEquals(result, maxSubBSTSize1(head)); + } + + /** + * 给定一棵二叉树的头节点head,返回这颗二叉树中最大的二叉搜索子树的大小 + */ + private int maxSubBSTSize(TreeNode head) { + if (head == null) { + return 0; + } + return 1; + } + + + @AllArgsConstructor + private class Info { + } + + //-------------------------- 对数器 --------------------------// + private int maxSubBSTSize1(TreeNode head) { + if (head == null) { + return 0; + } + int h = getBSTSize(head); + if (h != 0) { + return h; + } + return Math.max(maxSubBSTSize1(head.left), maxSubBSTSize1(head.right)); + } + + public static int getBSTSize(TreeNode head) { + if (head == null) { + return 0; + } + ArrayList arr = new ArrayList<>(); + in(head, arr); + for (int i = 1; i < arr.size(); i++) { + if (arr.get(i).val <= arr.get(i - 1).val) { + return 0; + } + } + return arr.size(); + } + + public static void in(TreeNode head, ArrayList arr) { + if (head == null) { + return; + } + in(head.left, arr); + arr.add(head); + in(head.right, arr); + } +} diff --git "a/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0204_\346\240\221\345\236\213DP/Code06_IsCBT.java" "b/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0204_\346\240\221\345\236\213DP/Code06_IsCBT.java" new file mode 100644 index 00000000..71aae475 --- /dev/null +++ "b/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0204_\346\240\221\345\236\213DP/Code06_IsCBT.java" @@ -0,0 +1,90 @@ +package algorithmzuo.b_体系学习班.c0204_树型DP; + +import common.CommonConstants; +import common.datastruct.TreeNode; +import common.util.ConstructBinaryTree; +import common.util.SysRandom; +import lombok.AllArgsConstructor; +import org.junit.Test; + +import java.util.LinkedList; + +/** + * Created by nibnait on 2022/10/29 + */ +public class Code06_IsCBT { + + @Test + public void loopTestCase() { + for (int i = 0; i < CommonConstants.TEST_CASE_COUNT_1000; i++) { + testCase(); + } + } + + @Test + public void testCase() { + int maxLevel = SysRandom.randomInt(1, 6); + int maxValue = SysRandom.random(100); + + TreeNode head = ConstructBinaryTree.generateRandomBinaryTree(maxLevel, maxValue); +// PrintBinaryTree.print(head); +// SysOut.printSeparator(); + + boolean result = isCBT(head); +// Assert.assertEquals(comparator(head), result); + } + + /** + * 判断二叉树是不是完全二叉树 + * 每棵子树,都有左右孩子。 + */ + private boolean isCBT(TreeNode head) { + if (head == null) { + return true; + } + return true; + } + + @AllArgsConstructor + private class Info { + + } + + + //-------------------------- 对数器 --------------------------// + private boolean comparator(TreeNode head) { + if (head == null) { + return true; + } + LinkedList queue = new LinkedList<>(); + // 是否遇到过左右两个孩子不双全的节点 + boolean leaf = false; + TreeNode l = null; + TreeNode r = null; + queue.add(head); + while (!queue.isEmpty()) { + head = queue.poll(); + l = head.left; + r = head.right; + if ( + // 如果遇到了不双全的节点之后,又发现当前节点不是叶节点 + (leaf && (l != null || r != null)) + || + (l == null && r != null) + + ) { + return false; + } + if (l != null) { + queue.add(l); + } + if (r != null) { + queue.add(r); + } + if (l == null || r == null) { + leaf = true; + } + } + return true; + } +} diff --git "a/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0204_\346\240\221\345\236\213DP/Code07_MaxSubBSTHead.java" "b/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0204_\346\240\221\345\236\213DP/Code07_MaxSubBSTHead.java" new file mode 100644 index 00000000..66b4fea1 --- /dev/null +++ "b/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0204_\346\240\221\345\236\213DP/Code07_MaxSubBSTHead.java" @@ -0,0 +1,91 @@ +package algorithmzuo.b_体系学习班.c0204_树型DP; + +import common.CommonConstants; +import common.datastruct.TreeNode; +import common.util.ConstructBinaryTree; +import common.util.PrintBinaryTree; +import common.util.SysOut; +import common.util.SysRandom; +import lombok.AllArgsConstructor; +import org.junit.Assert; +import org.junit.Test; + +import java.util.ArrayList; + +/** + * Created by nibnait on 2022/10/31 + */ +public class Code07_MaxSubBSTHead { + + @Test + public void loopTestCase() { + for (int i = 0; i < CommonConstants.TEST_CASE_COUNT_1000; i++) { + testCase(); + } + } + + @Test + public void testCase() { + int maxLevel = SysRandom.randomInt(1, 6); + int maxValue = SysRandom.random(100); + + TreeNode head = ConstructBinaryTree.generateRandomBinaryTree(maxLevel, maxValue); + PrintBinaryTree.print(head); + SysOut.printSeparator(); + + TreeNode result = maxSubBSTHead(head); + + Assert.assertEquals(result, maxSubBSTHead1(head)); + } + + /** + * 给定一棵二叉树的头节点head,返回这颗二叉树中最大的二叉搜索子树的头节点 + */ + private TreeNode maxSubBSTHead(TreeNode head) { + if (head == null) { + return null; + } + return null; + } + + + @AllArgsConstructor + private class Info { + } + + //-------------------------- 对数器 --------------------------// + private TreeNode maxSubBSTHead1(TreeNode head) { + if (head == null) { + return null; + } + if (getBSTSize(head) != 0) { + return head; + } + TreeNode leftAns = maxSubBSTHead1(head.left); + TreeNode rightAns = maxSubBSTHead1(head.right); + return getBSTSize(leftAns) >= getBSTSize(rightAns) ? leftAns : rightAns; + } + + public static int getBSTSize(TreeNode head) { + if (head == null) { + return 0; + } + ArrayList arr = new ArrayList<>(); + in(head, arr); + for (int i = 1; i < arr.size(); i++) { + if (arr.get(i).val <= arr.get(i - 1).val) { + return 0; + } + } + return arr.size(); + } + + public static void in(TreeNode head, ArrayList arr) { + if (head == null) { + return; + } + in(head.left, arr); + arr.add(head); + in(head.right, arr); + } +} diff --git "a/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0204_\346\240\221\345\236\213DP/Code08_lowestAncestor.java" "b/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0204_\346\240\221\345\236\213DP/Code08_lowestAncestor.java" new file mode 100644 index 00000000..d7006f98 --- /dev/null +++ "b/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0204_\346\240\221\345\236\213DP/Code08_lowestAncestor.java" @@ -0,0 +1,93 @@ +package algorithmzuo.b_体系学习班.c0204_树型DP; + +import common.CommonConstants; +import common.datastruct.TreeNode; +import common.util.ConstructBinaryTree; +import common.util.PrintBinaryTree; +import common.util.SysOut; +import common.util.SysRandom; +import lombok.AllArgsConstructor; +import org.junit.Assert; +import org.junit.Test; + +import java.util.HashMap; +import java.util.HashSet; + +/** + * Created by nibnait on 2022/10/31 + */ +public class Code08_lowestAncestor { + + @Test + public void loopTestCase() { + for (int i = 0; i < CommonConstants.TEST_CASE_COUNT_1000; i++) { + testCase(); + } + } + + @Test + public void testCase() { + int maxLevel = SysRandom.randomInt(1, 6); + int maxValue = SysRandom.random(100); + + TreeNode head = ConstructBinaryTree.generateRandomBinaryTree(maxLevel, maxValue); + TreeNode o1 = ConstructBinaryTree.pickRandomOne(head); + TreeNode o2 = ConstructBinaryTree.pickRandomOne(head); + PrintBinaryTree.print(head); + SysOut.printSeparator(); + + TreeNode result = lowestAncestor(head, o1, o2); + Assert.assertEquals(comparator(head, o1, o2), result); + } + + /** + * 给定一棵二叉树的头节点head,和另外两个节点a和b,返回a和b的最低公共祖先 + */ + private TreeNode lowestAncestor(TreeNode head, TreeNode o1, TreeNode o2) { + if (head == null) { + return null; + } + return null; + } + + @AllArgsConstructor + private class Info { + + } + + + //-------------------------- 对数器 --------------------------// + private TreeNode comparator(TreeNode head, TreeNode o1, TreeNode o2) { + if (head == null) { + return null; + } + // key的父节点是value + HashMap parentMap = new HashMap<>(); + parentMap.put(head, null); + fillParentMap(head, parentMap); + HashSet o1Set = new HashSet<>(); + TreeNode cur = o1; + o1Set.add(cur); + while (parentMap.get(cur) != null) { + cur = parentMap.get(cur); + o1Set.add(cur); + } + cur = o2; + while (!o1Set.contains(cur)) { + cur = parentMap.get(cur); + } + return cur; + } + + + public void fillParentMap(TreeNode head, HashMap parentMap) { + if (head.left != null) { + parentMap.put(head.left, head); + fillParentMap(head.left, parentMap); + } + if (head.right != null) { + parentMap.put(head.right, head); + fillParentMap(head.right, parentMap); + } + } +} diff --git "a/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0204_\346\240\221\345\236\213DP/Code09_MaxHappy.java" "b/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0204_\346\240\221\345\236\213DP/Code09_MaxHappy.java" new file mode 100644 index 00000000..e4dc980a --- /dev/null +++ "b/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c0204_\346\240\221\345\236\213DP/Code09_MaxHappy.java" @@ -0,0 +1,110 @@ +package algorithmzuo.b_体系学习班.c0204_树型DP; + +import common.CommonConstants; +import common.datastruct.TreeNode; +import lombok.AllArgsConstructor; +import org.junit.Assert; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by nibnait on 2022/10/31 + */ +public class Code09_MaxHappy { + + private static class Employee { + public int happy; + public List nexts; + + public Employee(int h) { + happy = h; + nexts = new ArrayList<>(); + } + } + + @Test + public void loopTestCase() { + for (int i = 0; i < CommonConstants.TEST_CASE_COUNT_1000; i++) { + testCase(); + } + } + + @Test + public void testCase() { + int maxLevel = 4; + int maxNexts = 7; + int maxHappy = 100; + int testTimes = 100000; + + Employee boss = genarateBoss(maxLevel, maxNexts, maxHappy); + + TreeNode result = maxHappy(boss); + + Assert.assertEquals(result, maxHappy1(boss)); + } + + private TreeNode maxHappy(Employee boss) { + return null; + } + + @AllArgsConstructor + private class Info { + + } + + //-------------------------- 对数器 --------------------------// + private int maxHappy1(Employee boss) { + if (boss == null) { + return 0; + } + return process1(boss, false); + } + + // 当前来到的节点叫cur, + // up表示cur的上级是否来, + // 该函数含义: + // 如果up为true,表示在cur上级已经确定来,的情况下,cur整棵树能够提供最大的快乐值是多少? + // 如果up为false,表示在cur上级已经确定不来,的情况下,cur整棵树能够提供最大的快乐值是多少? + public static int process1(Employee cur, boolean up) { + if (up) { // 如果cur的上级来的话,cur没得选,只能不来 + int ans = 0; + for (Employee next : cur.nexts) { + ans += process1(next, false); + } + return ans; + } else { // 如果cur的上级不来的话,cur可以选,可以来也可以不来 + int p1 = cur.happy; + int p2 = 0; + for (Employee next : cur.nexts) { + p1 += process1(next, true); + p2 += process1(next, false); + } + return Math.max(p1, p2); + } + } + + // for test + public static Employee genarateBoss(int maxLevel, int maxNexts, int maxHappy) { + if (Math.random() < 0.02) { + return null; + } + Employee boss = new Employee((int) (Math.random() * (maxHappy + 1))); + genarateNexts(boss, 1, maxLevel, maxNexts, maxHappy); + return boss; + } + + // for test + public static void genarateNexts(Employee e, int level, int maxLevel, int maxNexts, int maxHappy) { + if (level > maxLevel) { + return; + } + int nextsSize = (int) (Math.random() * (maxNexts + 1)); + for (int i = 0; i < nextsSize; i++) { + Employee next = new Employee((int) (Math.random() * (maxHappy + 1))); + e.nexts.add(next); + genarateNexts(next, level + 1, maxLevel, maxNexts, maxHappy); + } + } +} diff --git "a/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c02xx_summary.md" "b/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c02xx_summary.md" deleted file mode 100644 index da290a0d..00000000 --- "a/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c02xx_summary.md" +++ /dev/null @@ -1,5 +0,0 @@ -### 链表 三板斧 -双指针 - - -### 二叉树 \ No newline at end of file diff --git "a/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c02xx_\351\223\276\350\241\250\345\222\214\346\240\221.md" "b/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c02xx_\351\223\276\350\241\250\345\222\214\346\240\221.md" new file mode 100644 index 00000000..b94fcb29 --- /dev/null +++ "b/src/main/test/algorithmzuo/b_\344\275\223\347\263\273\345\255\246\344\271\240\347\217\255/c02xx_\351\223\276\350\241\250\345\222\214\346\240\221.md" @@ -0,0 +1,36 @@ +## 链表 + +[链表专题](../../../../main/java/algorithm_practice/nowcoder/b_2nd_Season/bf160824/README.md) + +## 二叉树 +[二叉树专题(一)](../../../../main/java/algorithm_practice/nowcoder/b_2nd_Season/bh160907/README.md) +[二叉树专题(二)](../../../../main/java/algorithm_practice/nowcoder/b_2nd_Season/bi160914/README.md) +[二叉树专题(三)](../../../../main/java/algorithm_practice/nowcoder/b_2nd_Season/bj160928/README.md) + + - [Code01_先序、中序、后序遍历-递归](./c0203_树/Code01_RecursiveTraversalBT.java) + - [Code02_先序、中序、后序遍历-非递归](./c0203_树/Code02_UnRecursiveTraversalBT.java) + - [Code03_二叉树的按层遍历](./c0203_树/Code03_LevelTraversalBT.java) + - [Code04_二叉树的序列化和反序列化](./c0203_树/Code04_SerializeAndReconstructTree.java) + - [Code05_N叉树如何通过二叉树来序列化、并完成反序列化](./c0203_树/Code05_EncodeNaryTreeToBinaryTree.java) + - [Code06_求二叉树的最大宽度](./c0203_树/Code06_TreeMaxWidth.java) + +### 树型 DP 的通用套路 + + - [Code01_判断二叉树是不是平衡二叉树](./c0204_树型DP/Code01_IsBalanced.java) + - [Code02_判断二叉树是不是搜索二叉树](./c0204_树型DP/Code02_IsBST.java) + - ⭐️[Code03_给定一棵二叉树的头节点head,任何两个节点之间都存在距离,返回整棵二叉树的最大距离](./c0204_树型DP/Code03_MaxDistance.java) + - [Code04_判断二叉树是不是满二叉树](./c0204_树型DP/Code04_IsFull.java) + - ⭐️[Code05_给定一棵二叉树的头节点head,返回这颗二叉树中最大的二叉搜索子树的大小](./c0204_树型DP/Code05_MaxSubBSTSize.java) + - ⭐️[Code06_判断二叉树是不是完全二叉树](./c0204_树型DP/Code06_IsCBT.java) + - ️[Code07_给定一棵二叉树的头节点head,返回这颗二叉树中最大的二叉搜索子树的头节点](./c0204_树型DP/Code07_MaxSubBSTHead.java) + - ️[Code08_给定一棵二叉树的头节点head,和另外两个节点a和b,返回a和b的最低公共祖先](./c0204_树型DP/Code08_lowestAncestor.java) + - ️[Code09_派对的最大快乐值](./c0204_树型DP/Code09_MaxHappy.java) + + +**介绍二叉树的递归套路** +1)假设以X节点为头,假设可以向X左树和X右树要任何信息 +2)在上一步的假设下,讨论以X为头节点的树,得到答案的可能性(最重要) +3)列出所有可能性后,确定到底需要向左树和右树要什么样的信息 +4)把左树信息和右树信息求全集,就是任何一棵子树都需要返回的信息S +5)递归函数都返回S,每一棵子树都这么要求 +6)写代码,在代码中考虑如何把左树的信息和右树信息整合出整棵树的信息 \ No newline at end of file