list = new ArrayList<>();
+ for (int i = 0; i < weight.length; i++) {
+ weight[i][i] = 0;
+ int val = getVal(graph, i);
+ int x = getX(graph, i);
+ int y = getY(graph, i);
+ if (x == 0 || x == height - 1) {
+ list.add(i);
+ }
+ if (y == 0 || y == width - 1) {
+ list.add(i);
+ }
+ if (y < (width - 1) && i + 1 < total && getVal(graph, i + 1) <= val) {
+ weight[i][i + 1] = 1;
+ }
+ if (y != 0 && i - 1 >= 0 && getVal(graph, i - 1) <= val) {
+ weight[i][i - 1] = 1;
+ }
+ if (i + width < total && getVal(graph, i + width) <= val) {
+ weight[i][i + width] = 1;
+ }
+ if (i - width >= 0 && getVal(graph, i - width) <= val) {
+ weight[i][i - width] = 1;
+ }
+ }
+
+ int start = startX * width + startY;
+ int resultIndex = -1;
+ int resultLen = 256;
+ for (int i = 0; i < list.size(); i++) {
+ if (getVal(graph, list.get(i)) <= start) {
+ int len = resolve(start, list.get(i));
+ if (len < resultLen) {
+ resultLen = len;
+ resultIndex = list.get(i);
+ }
+ }
+ }
+ if (resultLen >= 256) {
+ System.out.print("-1 -1 -1");
+ return;
+ }
+ System.out.print(resultIndex / graph.length + " " + resultIndex % graph.length + " " + resultLen);
+ }
+
+ public static int resolve(int start, int end) {
+
+ if (start < 0 || end < 0 || start >= weight.length || end >= weight.length) {
+ return MAX;
+ }
+
+ boolean[] isVisited = new boolean[weight.length];
+ int[] d = new int[weight.length];
+
+ for (int i = 0; i < weight.length; i++) {
+ isVisited[i] = false;
+ d[i] = MAX;
+ }
+ d[start] = 0;
+ isVisited[start] = true;
+ int unVisitedNum = weight.length;
+ int index = start;
+
+ while (unVisitedNum > 0 && index != end) {
+ int min = MAX;
+ for (int i = 0; i < weight.length; i++) {
+ if (min > d[i] && !isVisited[i]) {
+ min = d[i];
+ index = i;
+ }
+ }
+ for (int i = 0; i < weight.length; i++) {
+ if (d[index] + weight[index][i] < d[i]) {
+ d[i] = d[index] + weight[index][i];
+ }
+ }
+ unVisitedNum--;
+ isVisited[index] = true;
+ }
+
+ return d[end];
+ }
+}
diff --git "a/src/\345\205\266\344\273\226/\351\230\277\346\213\211\344\274\257\346\225\260\345\255\227\350\275\254\344\270\255\346\226\207/Main.java" "b/src/\345\205\266\344\273\226/\351\230\277\346\213\211\344\274\257\346\225\260\345\255\227\350\275\254\344\270\255\346\226\207/Main.java"
new file mode 100644
index 0000000..1ff4aa2
--- /dev/null
+++ "b/src/\345\205\266\344\273\226/\351\230\277\346\213\211\344\274\257\346\225\260\345\255\227\350\275\254\344\270\255\346\226\207/Main.java"
@@ -0,0 +1,50 @@
+package 其他.阿拉伯数字转中文;
+
+/**
+ * @author yuanguangxin
+ */
+public class Main {
+ private static final char[] numArrays = {'零', '一', '二', '三', '四', '五', '六', '七', '八', '九'};
+ private static final char[] units = {'十', '百', '千', '万', '亿'};
+ private static final StringBuilder ans = new StringBuilder();
+
+ private static void intToChineseNum(int num) {
+ String s = String.valueOf(num);
+ char[] chars = s.toCharArray();
+ int n = chars.length;
+
+ // 只剩下一位时, 直接返回 numArrays 数组中对应的数字
+ if (n == 1) {
+ ans.append(numArrays[chars[0] - '0']);
+ // 如果 num 超过 5 位, 则先判断是否上亿, 然后将 num 拆分
+ } else if (n >= 5) {
+ n = n >= 9 ? 9 : 5;
+ int multi = (int) Math.pow(10, n - 1);
+ // div 表示 num 中上亿或上万的部分数值
+ int div = num / multi;
+ // mod 表示剩余的部分数值
+ int mod = num % multi;
+ // 对前一部分数值进行转换, 然后添加单位万/亿
+ intToChineseNum(div);
+ ans.append(n == 5 ? units[3] : units[4]);
+ String s1 = String.valueOf(div);
+ String s2 = String.valueOf(mod);
+ // 判断中间是否有 0
+ if (s.charAt(s1.length() - 1) == '0' || s2.length() < n - 1) ans.append("零");
+ // 转换剩余部分
+ intToChineseNum(mod);
+ // 如果 num 不超过 5 位, 处理过程与上面相似
+ } else {
+ int multi = (int) Math.pow(10, n - 1);
+ int div = num / multi;
+ int mod = num % multi;
+ ans.append(numArrays[div]).append(units[n - 2]);
+ if (mod != 0) {
+ if (String.valueOf(mod).length() < n - 1) {
+ ans.append("零");
+ }
+ intToChineseNum(mod);
+ }
+ }
+ }
+}
diff --git "a/src/\345\212\250\346\200\201\350\247\204\345\210\222/q1143_\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227/Solution.java" "b/src/\345\212\250\346\200\201\350\247\204\345\210\222/q1143_\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227/Solution.java"
new file mode 100644
index 0000000..9f55848
--- /dev/null
+++ "b/src/\345\212\250\346\200\201\350\247\204\345\210\222/q1143_\346\234\200\351\225\277\345\205\254\345\205\261\345\255\220\345\272\217\345\210\227/Solution.java"
@@ -0,0 +1,61 @@
+package 动态规划.q1143_最长公共子序列;
+
+/**
+ * 动态规划 dp[i + 1][j + 1] = Math.max(dp[i+1][j], dp[i][j+1]) o(m*n)
+ *
+ * 若题目为最长公共子串,则在c1,c2不相等时不做处理(赋值0),在遍历过程中记录最大值即可
+ */
+public class Solution {
+
+ public int longestCommonSubsequence(String text1, String text2) {
+ int m = text1.length();
+ int n = text2.length();
+ int[][] dp = new int[m + 1][n + 1];
+
+ for (int i = 0; i < m; i++) {
+ for (int j = 0; j < n; j++) {
+ char c1 = text1.charAt(i);
+ char c2 = text2.charAt(j);
+ if (c1 == c2) {
+ dp[i + 1][j + 1] = dp[i][j] + 1;
+ } else {
+ dp[i + 1][j + 1] = Math.max(dp[i + 1][j], dp[i][j + 1]);
+ }
+ }
+ }
+ return dp[m][n];
+ }
+
+ /**
+ * 最长公共字串
+ *
+ * @param str1
+ * @param str2
+ * @return
+ */
+ public static String longestCommonSubstring(String str1, String str2) {
+ int m = str1.length();
+ int n = str2.length();
+ int[][] dp = new int[m + 1][n + 1];
+ int maxLength = 0;
+ int endIndex = -1;
+
+ for (int i = 1; i <= m; i++) {
+ for (int j = 1; j <= n; j++) {
+ if (str1.charAt(i - 1) == str2.charAt(j - 1)) {
+ dp[i][j] = dp[i - 1][j - 1] + 1;
+ if (dp[i][j] > maxLength) {
+ maxLength = dp[i][j];
+ endIndex = i - 1;
+ }
+ } else {
+ dp[i][j] = 0;
+ }
+ }
+ }
+ if (maxLength == 0) {
+ return "";
+ }
+ return str1.substring(endIndex - maxLength + 1, endIndex + 1);
+ }
+}
diff --git "a/src/\345\217\214\346\214\207\351\222\210\351\201\215\345\216\206/q209_\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204/Solution.java" "b/src/\345\217\214\346\214\207\351\222\210\351\201\215\345\216\206/q209_\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204/Solution.java"
index 9f8a4bf..dad0410 100644
--- "a/src/\345\217\214\346\214\207\351\222\210\351\201\215\345\216\206/q209_\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204/Solution.java"
+++ "b/src/\345\217\214\346\214\207\351\222\210\351\201\215\345\216\206/q209_\351\225\277\345\272\246\346\234\200\345\260\217\347\232\204\345\255\220\346\225\260\347\273\204/Solution.java"
@@ -14,16 +14,7 @@ public int minSubArrayLen(int s, int[] nums) {
if (k == nums.length && i == nums.length) {
break;
}
- if (sum == s) {
- min = Math.min(k - i, min);
- if (k < nums.length) {
- sum += nums[k];
- k++;
- } else {
- sum -= nums[i];
- i++;
- }
- } else if (sum < s) {
+ if (sum < s) {
if (k == nums.length) {
break;
}
diff --git "a/src/\345\233\236\346\272\257\346\263\225/q40_\347\273\204\345\220\210\346\200\273\345\222\2142/Solution.java" "b/src/\345\233\236\346\272\257\346\263\225/q40_\347\273\204\345\220\210\346\200\273\345\222\2142/Solution.java"
new file mode 100644
index 0000000..b6aadee
--- /dev/null
+++ "b/src/\345\233\236\346\272\257\346\263\225/q40_\347\273\204\345\220\210\346\200\273\345\222\2142/Solution.java"
@@ -0,0 +1,42 @@
+package 回溯法.q40_组合总和2;
+
+import java.util.*;
+
+/**
+ * 回溯法 O(n*log(n))
+ */
+class Solution {
+
+ public List> combinationSum2(int[] candidates, int target) {
+ List> res = new ArrayList<>();
+ if (candidates.length == 0) {
+ return res;
+ }
+ Arrays.sort(candidates);
+ helper(candidates, target, 0, new LinkedList<>(), res);
+ return res;
+ }
+
+ public void helper(int[] candidates, int target, int start, LinkedList stack, List> res) {
+ if (start > candidates.length) {
+ return;
+ }
+ if (target == 0 && !stack.isEmpty()) {
+ List item = new ArrayList<>(stack);
+ res.add(item);
+ }
+ HashSet set = new HashSet<>();
+ for (int i = start; i < candidates.length; ++i) {
+ if (!set.contains(candidates[i]) && target >= candidates[i]) {
+ stack.push(candidates[i]);
+ helper(candidates, target - candidates[i], i + 1, stack, res);
+ stack.pop();
+ set.add(candidates[i]);
+ }
+ }
+ }
+
+ public static void main(String[] args) {
+ new Solution().combinationSum2(new int[]{10, 1, 2, 7, 6, 1, 5}, 8);
+ }
+}
diff --git "a/src/\345\255\227\345\205\270\346\240\221/q648_\345\215\225\350\257\215\346\233\277\346\215\242/Solution.java" "b/src/\345\255\227\345\205\270\346\240\221/q648_\345\215\225\350\257\215\346\233\277\346\215\242/Solution.java"
new file mode 100644
index 0000000..fb040fc
--- /dev/null
+++ "b/src/\345\255\227\345\205\270\346\240\221/q648_\345\215\225\350\257\215\346\233\277\346\215\242/Solution.java"
@@ -0,0 +1,49 @@
+package 字典树.q648_单词替换;
+
+import java.util.List;
+
+/**
+ * 构建字典树(前缀树)o(n)
+ */
+class Solution {
+ public String replaceWords(List roots, String sentence) {
+ TrieNode trie = new TrieNode();
+ for (String root : roots) {
+ TrieNode cur = trie;
+ for (char letter : root.toCharArray()) {
+ if (cur.children[letter - 'a'] == null) {
+ cur.children[letter - 'a'] = new TrieNode();
+ }
+ cur = cur.children[letter - 'a'];
+ }
+ cur.word = root;
+ }
+
+ StringBuilder ans = new StringBuilder();
+
+ for (String word : sentence.split(" ")) {
+ if (ans.length() > 0) {
+ ans.append(" ");
+ }
+
+ TrieNode cur = trie;
+ for (char letter : word.toCharArray()) {
+ if (cur.children[letter - 'a'] == null || cur.word != null) {
+ break;
+ }
+ cur = cur.children[letter - 'a'];
+ }
+ ans.append(cur.word != null ? cur.word : word);
+ }
+ return ans.toString();
+ }
+}
+
+class TrieNode {
+ TrieNode[] children;
+ String word;
+
+ TrieNode() {
+ children = new TrieNode[26];
+ }
+}
diff --git "a/src/\345\255\227\347\254\246\344\270\262\346\223\215\344\275\234/q736_\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264/Solution.java" "b/src/\345\255\227\347\254\246\344\270\262\346\223\215\344\275\234/q763_\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264/Solution.java"
similarity index 94%
rename from "src/\345\255\227\347\254\246\344\270\262\346\223\215\344\275\234/q736_\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264/Solution.java"
rename to "src/\345\255\227\347\254\246\344\270\262\346\223\215\344\275\234/q763_\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264/Solution.java"
index de3e054..418d11b 100644
--- "a/src/\345\255\227\347\254\246\344\270\262\346\223\215\344\275\234/q736_\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264/Solution.java"
+++ "b/src/\345\255\227\347\254\246\344\270\262\346\223\215\344\275\234/q763_\345\210\222\345\210\206\345\255\227\346\257\215\345\214\272\351\227\264/Solution.java"
@@ -1,4 +1,4 @@
-package 字符串操作.q736_划分字母区间;
+package 字符串操作.q763_划分字母区间;
import java.util.ArrayList;
import java.util.List;
diff --git "a/src/\345\277\253\346\205\242\346\214\207\351\222\210\351\201\215\345\216\206/q141_\347\216\257\345\275\242\351\223\276\350\241\250/f1/ListNode.java" "b/src/\345\277\253\346\205\242\346\214\207\351\222\210\351\201\215\345\216\206/q141_\347\216\257\345\275\242\351\223\276\350\241\250/f1/ListNode.java"
index 94c7688..4aee435 100644
--- "a/src/\345\277\253\346\205\242\346\214\207\351\222\210\351\201\215\345\216\206/q141_\347\216\257\345\275\242\351\223\276\350\241\250/f1/ListNode.java"
+++ "b/src/\345\277\253\346\205\242\346\214\207\351\222\210\351\201\215\345\216\206/q141_\347\216\257\345\275\242\351\223\276\350\241\250/f1/ListNode.java"
@@ -1,4 +1,4 @@
-package hash相关.q141_环形链表.f1;
+package 快慢指针遍历.q141_环形链表.f1;
public class ListNode {
diff --git "a/src/\345\277\253\346\205\242\346\214\207\351\222\210\351\201\215\345\216\206/q141_\347\216\257\345\275\242\351\223\276\350\241\250/f1/Solution.java" "b/src/\345\277\253\346\205\242\346\214\207\351\222\210\351\201\215\345\216\206/q141_\347\216\257\345\275\242\351\223\276\350\241\250/f1/Solution.java"
index d2397e0..bc1f608 100644
--- "a/src/\345\277\253\346\205\242\346\214\207\351\222\210\351\201\215\345\216\206/q141_\347\216\257\345\275\242\351\223\276\350\241\250/f1/Solution.java"
+++ "b/src/\345\277\253\346\205\242\346\214\207\351\222\210\351\201\215\345\216\206/q141_\347\216\257\345\275\242\351\223\276\350\241\250/f1/Solution.java"
@@ -1,4 +1,4 @@
-package hash相关.q141_环形链表.f1;
+package 快慢指针遍历.q141_环形链表.f1;
import java.util.HashSet;
import java.util.Set;
diff --git "a/src/\345\277\253\346\205\242\346\214\207\351\222\210\351\201\215\345\216\206/q141_\347\216\257\345\275\242\351\223\276\350\241\250/f2/ListNode.java" "b/src/\345\277\253\346\205\242\346\214\207\351\222\210\351\201\215\345\216\206/q141_\347\216\257\345\275\242\351\223\276\350\241\250/f2/ListNode.java"
index 07603ce..92332c4 100644
--- "a/src/\345\277\253\346\205\242\346\214\207\351\222\210\351\201\215\345\216\206/q141_\347\216\257\345\275\242\351\223\276\350\241\250/f2/ListNode.java"
+++ "b/src/\345\277\253\346\205\242\346\214\207\351\222\210\351\201\215\345\216\206/q141_\347\216\257\345\275\242\351\223\276\350\241\250/f2/ListNode.java"
@@ -1,4 +1,4 @@
-package hash相关.q141_环形链表.f2;
+package 快慢指针遍历.q141_环形链表.f2;
public class ListNode {
diff --git "a/src/\345\277\253\346\205\242\346\214\207\351\222\210\351\201\215\345\216\206/q141_\347\216\257\345\275\242\351\223\276\350\241\250/f2/Solution.java" "b/src/\345\277\253\346\205\242\346\214\207\351\222\210\351\201\215\345\216\206/q141_\347\216\257\345\275\242\351\223\276\350\241\250/f2/Solution.java"
index 2b1721e..c297e24 100644
--- "a/src/\345\277\253\346\205\242\346\214\207\351\222\210\351\201\215\345\216\206/q141_\347\216\257\345\275\242\351\223\276\350\241\250/f2/Solution.java"
+++ "b/src/\345\277\253\346\205\242\346\214\207\351\222\210\351\201\215\345\216\206/q141_\347\216\257\345\275\242\351\223\276\350\241\250/f2/Solution.java"
@@ -1,4 +1,4 @@
-package hash相关.q141_环形链表.f2;
+package 快慢指针遍历.q141_环形链表.f2;
/**
* 快慢指针 o(n)
diff --git "a/src/\345\277\253\346\205\242\346\214\207\351\222\210\351\201\215\345\216\206/q202_\345\277\253\344\271\220\346\225\260/Solution.java" "b/src/\345\277\253\346\205\242\346\214\207\351\222\210\351\201\215\345\216\206/q202_\345\277\253\344\271\220\346\225\260/Solution.java"
index 624eb3e..76a30d7 100644
--- "a/src/\345\277\253\346\205\242\346\214\207\351\222\210\351\201\215\345\216\206/q202_\345\277\253\344\271\220\346\225\260/Solution.java"
+++ "b/src/\345\277\253\346\205\242\346\214\207\351\222\210\351\201\215\345\216\206/q202_\345\277\253\344\271\220\346\225\260/Solution.java"
@@ -1,4 +1,4 @@
-package 数字操作.q202_快乐数;
+package 快慢指针遍历.q202_快乐数;
/**
* 快慢指针,思想同q141判断是否有环,用快慢指针找出循环终止条件 o(n)
diff --git "a/src/\346\225\260\345\255\227\346\223\215\344\275\234/q1920_\345\237\272\344\272\216\346\216\222\345\210\227\346\236\204\345\273\272\346\225\260\347\273\204/Solution.java" "b/src/\346\225\260\345\255\227\346\223\215\344\275\234/q1920_\345\237\272\344\272\216\346\216\222\345\210\227\346\236\204\345\273\272\346\225\260\347\273\204/Solution.java"
new file mode 100644
index 0000000..9c2cc24
--- /dev/null
+++ "b/src/\346\225\260\345\255\227\346\223\215\344\275\234/q1920_\345\237\272\344\272\216\346\216\222\345\210\227\346\236\204\345\273\272\346\225\260\347\273\204/Solution.java"
@@ -0,0 +1,23 @@
+package 数字操作.q1920_基于排列构建数组;
+
+/**
+ * 注意观察题目,数组中数字为[0,999]闭区间
+ */
+class Solution {
+ public int[] buildArray(int[] nums) {
+ int n = nums.length;
+ for (int i = 0; i < n; i++) {
+ nums[i] += 1000 * (nums[nums[i]] % 1000);
+ System.out.println(nums[i]);
+ }
+ for (int i = 0; i < n; i++) {
+ nums[i] /= 1000;
+ }
+ return nums;
+ }
+
+ public static void main(String[] args) {
+ int[] nums = new int[]{3, 2, 0, 1, 4};
+ new Solution().buildArray(nums);
+ }
+}
diff --git "a/src/\346\225\260\347\273\204\346\223\215\344\275\234/q384_\346\211\223\344\271\261\346\225\260\347\273\204/Solution.java" "b/src/\346\225\260\347\273\204\346\223\215\344\275\234/q384_\346\211\223\344\271\261\346\225\260\347\273\204/Solution.java"
new file mode 100644
index 0000000..f7a5831
--- /dev/null
+++ "b/src/\346\225\260\347\273\204\346\223\215\344\275\234/q384_\346\211\223\344\271\261\346\225\260\347\273\204/Solution.java"
@@ -0,0 +1,46 @@
+package 数组操作.q384_打乱数组;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+/**
+ * 洗牌算法 o(n)
+ */
+public class Solution {
+ private int[] array;
+ private int[] original;
+
+ private Random rand = new Random();
+
+ private List getArrayCopy() {
+ List asList = new ArrayList<>();
+ for (int i = 0; i < array.length; i++) {
+ asList.add(array[i]);
+ }
+ return asList;
+ }
+
+ public Solution(int[] nums) {
+ array = nums;
+ original = nums.clone();
+ }
+
+ public int[] reset() {
+ array = original;
+ original = original.clone();
+ return array;
+ }
+
+ public int[] shuffle() {
+ List aux = getArrayCopy();
+
+ for (int i = 0; i < array.length; i++) {
+ int removeIdx = rand.nextInt(aux.size());
+ array[i] = aux.get(removeIdx);
+ aux.remove(removeIdx);
+ }
+
+ return array;
+ }
+}
\ No newline at end of file
diff --git "a/src/\346\225\260\347\273\204\346\223\215\344\275\234/q581_\346\234\200\347\237\255\346\227\240\345\272\217\350\277\236\347\273\255\345\255\220\346\225\260\347\273\204/Solution.java" "b/src/\346\225\260\347\273\204\346\223\215\344\275\234/q581_\346\234\200\347\237\255\346\227\240\345\272\217\350\277\236\347\273\255\345\255\220\346\225\260\347\273\204/Solution.java"
new file mode 100644
index 0000000..491b5ae
--- /dev/null
+++ "b/src/\346\225\260\347\273\204\346\223\215\344\275\234/q581_\346\234\200\347\237\255\346\227\240\345\272\217\350\277\236\347\273\255\345\255\220\346\225\260\347\273\204/Solution.java"
@@ -0,0 +1,32 @@
+package 数组操作.q581_最短无序连续子数组;
+
+import java.util.Arrays;
+
+/**
+ * 利用排序 o(n*log(n))
+ */
+public class Solution {
+
+ public int findUnsortedSubarray(int[] nums) {
+ if (nums == null || nums.length < 1) {
+ return 0;
+ }
+
+ int[] cloneNums = nums.clone();
+ Arrays.sort(nums);
+
+ int begin = Integer.MAX_VALUE;
+ int end = 0;
+ for (int i = 0; i < nums.length; i++) {
+ if (nums[i] != cloneNums[i]) {
+ begin = Math.min(begin, i);
+ end = Math.max(end, i);
+ }
+ }
+ return Math.max(end - begin + 1, 0);
+ }
+
+ public static void main(String[] args) {
+ new Solution().findUnsortedSubarray(new int[]{2, 6, 4, 8, 10, 9, 15});
+ }
+}
diff --git "a/src/\346\225\260\347\273\204\346\223\215\344\275\234/q78_\345\255\220\351\233\206/Solution.java" "b/src/\346\225\260\347\273\204\346\223\215\344\275\234/q78_\345\255\220\351\233\206/Solution.java"
new file mode 100644
index 0000000..d47219e
--- /dev/null
+++ "b/src/\346\225\260\347\273\204\346\223\215\344\275\234/q78_\345\255\220\351\233\206/Solution.java"
@@ -0,0 +1,24 @@
+package 数组操作.q78_子集;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 向子集中添加子集合 o(n*2^n)
+ */
+public class Solution {
+
+ public List> subsets(int[] nums) {
+ List> result = new ArrayList<>();
+ result.add(new ArrayList<>());
+ for (int i = 0; i < nums.length; i++) {
+ int size = result.size();
+ for (int j = 0; j < size; j++) {
+ List temp = new ArrayList<>(result.get(j));
+ temp.add(nums[i]);
+ result.add(temp);
+ }
+ }
+ return result;
+ }
+}
diff --git "a/src/\346\240\210\347\233\270\345\205\263/q232_\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227/f1/MyQueue.java" "b/src/\346\240\210\347\233\270\345\205\263/q232_\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227/f1/MyQueue.java"
new file mode 100644
index 0000000..9a6f4cf
--- /dev/null
+++ "b/src/\346\240\210\347\233\270\345\205\263/q232_\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227/f1/MyQueue.java"
@@ -0,0 +1,51 @@
+package 栈相关.q232_用栈实现队列.f1;
+
+import java.util.Stack;
+
+/**
+ * 双栈 入队o(n) 出队o(1)
+ */
+class MyQueue {
+
+ private Stack s1 = new Stack<>();
+ private Stack s2 = new Stack<>();
+ private Integer front;
+
+ /** Initialize your data structure here. */
+ public MyQueue() {
+
+ }
+
+ /** Push element x to the back of queue. */
+ public void push(int x) {
+ if (s1.empty()){
+ front = x;
+ }
+ while (!s1.isEmpty()){
+ s2.push(s1.pop());
+ }
+ s2.push(x);
+ while (!s2.isEmpty()){
+ s1.push(s2.pop());
+ }
+ }
+
+ /** Removes the element from in front of queue and returns that element. */
+ public int pop() {
+ int value = s1.pop();
+ if (!s1.empty()){
+ front = s1.peek();
+ }
+ return value;
+ }
+
+ /** Get the front element. */
+ public int peek() {
+ return front;
+ }
+
+ /** Returns whether the queue is empty. */
+ public boolean empty() {
+ return s1.isEmpty();
+ }
+}
diff --git "a/src/\346\240\210\347\233\270\345\205\263/q232_\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227/f2/MyQueue.java" "b/src/\346\240\210\347\233\270\345\205\263/q232_\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227/f2/MyQueue.java"
new file mode 100644
index 0000000..22a6e97
--- /dev/null
+++ "b/src/\346\240\210\347\233\270\345\205\263/q232_\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227/f2/MyQueue.java"
@@ -0,0 +1,49 @@
+package 栈相关.q232_用栈实现队列.f2;
+
+import java.util.Stack;
+
+/**
+ * 双栈 入队o(1) 出队平均o(1),最坏o(n)
+ */
+class MyQueue {
+
+ private Stack s1 = new Stack<>();
+ private Stack s2 = new Stack<>();
+ private Integer front;
+
+ /** Initialize your data structure here. */
+ public MyQueue() {
+
+ }
+
+ /** Push element x to the back of queue. */
+ public void push(int x) {
+ if (s1.empty()){
+ front = x;
+ }
+ s1.push(x);
+ }
+
+ /** Removes the element from in front of queue and returns that element. */
+ public int pop() {
+ if (s2.isEmpty()) {
+ while (!s1.isEmpty()){
+ s2.push(s1.pop());
+ }
+ }
+ return s2.pop();
+ }
+
+ /** Get the front element. */
+ public int peek() {
+ if (!s2.isEmpty()) {
+ return s2.peek();
+ }
+ return front;
+ }
+
+ /** Returns whether the queue is empty. */
+ public boolean empty() {
+ return s1.isEmpty() && s2.isEmpty();
+ }
+}
diff --git "a/src/\346\240\210\347\233\270\345\205\263/q232_\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227/\345\220\253\346\234\211\346\234\200\345\244\247\345\200\274\347\232\204\351\230\237\345\210\227/MaxQueue.java" "b/src/\346\240\210\347\233\270\345\205\263/q232_\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227/\345\220\253\346\234\211\346\234\200\345\244\247\345\200\274\347\232\204\351\230\237\345\210\227/MaxQueue.java"
new file mode 100644
index 0000000..32562be
--- /dev/null
+++ "b/src/\346\240\210\347\233\270\345\205\263/q232_\347\224\250\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227/\345\220\253\346\234\211\346\234\200\345\244\247\345\200\274\347\232\204\351\230\237\345\210\227/MaxQueue.java"
@@ -0,0 +1,34 @@
+package 栈相关.q232_用栈实现队列.含有最大值的队列;
+
+import java.util.LinkedList;
+import java.util.Queue;
+
+public class MaxQueue {
+
+ private Queue queue;
+ private LinkedList max;
+
+ public MaxQueue() {
+ queue = new LinkedList<>();
+ max = new LinkedList<>();
+ }
+
+ public int max_value() {
+ return max.size() == 0 ? -1 : max.getFirst();
+ }
+
+ public void push_back(int value) {
+ queue.add(value);
+ while (max.size() != 0 && max.getLast() < value) {
+ max.removeLast();
+ }
+ max.add(value);
+ }
+
+ public int pop_front() {
+ if (max.size() != 0 && queue.peek().equals(max.getFirst())) {
+ max.removeFirst();
+ }
+ return queue.size() == 0 ? -1 : queue.poll();
+ }
+}
diff --git "a/src/\346\240\221\347\232\204\351\201\215\345\216\206/q103_\344\272\214\345\217\211\346\240\221\347\232\204\351\224\257\351\275\277\345\275\242\345\261\202\345\272\217\351\201\215\345\216\206/Solution.java" "b/src/\346\240\221\347\232\204\351\201\215\345\216\206/q103_\344\272\214\345\217\211\346\240\221\347\232\204\351\224\257\351\275\277\345\275\242\345\261\202\345\272\217\351\201\215\345\216\206/Solution.java"
new file mode 100644
index 0000000..dff5487
--- /dev/null
+++ "b/src/\346\240\221\347\232\204\351\201\215\345\216\206/q103_\344\272\214\345\217\211\346\240\221\347\232\204\351\224\257\351\275\277\345\275\242\345\261\202\345\272\217\351\201\215\345\216\206/Solution.java"
@@ -0,0 +1,44 @@
+package 树的遍历.q103_二叉树的锯齿形层序遍历;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Queue;
+
+/**
+ * 和层序遍历相同,额外加一个标记控制插入队列的位置
+ */
+public class Solution {
+
+ public List> zigzagLevelOrder(TreeNode root) {
+ List> ans = new ArrayList<>();
+ if (root == null) {
+ return ans;
+ }
+ Queue queue = new LinkedList<>();
+ queue.add(root);
+ boolean flag = true;
+ while (!queue.isEmpty()) {
+ List list = new ArrayList<>();
+ int size = queue.size();
+ while (size > 0) {
+ TreeNode tn = queue.poll();
+ if (flag) {
+ list.add(tn.val);
+ } else {
+ list.add(0, tn.val);
+ }
+ if (tn.left != null) {
+ queue.add(tn.left);
+ }
+ if (tn.right != null) {
+ queue.add(tn.right);
+ }
+ size--;
+ }
+ flag = !flag;
+ ans.add(list);
+ }
+ return ans;
+ }
+}
diff --git "a/src/\346\240\221\347\232\204\351\201\215\345\216\206/q103_\344\272\214\345\217\211\346\240\221\347\232\204\351\224\257\351\275\277\345\275\242\345\261\202\345\272\217\351\201\215\345\216\206/TreeNode.java" "b/src/\346\240\221\347\232\204\351\201\215\345\216\206/q103_\344\272\214\345\217\211\346\240\221\347\232\204\351\224\257\351\275\277\345\275\242\345\261\202\345\272\217\351\201\215\345\216\206/TreeNode.java"
new file mode 100644
index 0000000..931d109
--- /dev/null
+++ "b/src/\346\240\221\347\232\204\351\201\215\345\216\206/q103_\344\272\214\345\217\211\346\240\221\347\232\204\351\224\257\351\275\277\345\275\242\345\261\202\345\272\217\351\201\215\345\216\206/TreeNode.java"
@@ -0,0 +1,11 @@
+package 树的遍历.q103_二叉树的锯齿形层序遍历;
+
+public class TreeNode {
+ int val;
+ TreeNode left;
+ TreeNode right;
+
+ TreeNode(int x) {
+ val = x;
+ }
+}
diff --git "a/src/\351\200\222\345\275\222/q1325_\345\210\240\351\231\244\347\273\231\345\256\232\345\200\274\347\232\204\345\217\266\345\255\220\350\212\202\347\202\271/Solution.java" "b/src/\351\200\222\345\275\222/q1325_\345\210\240\351\231\244\347\273\231\345\256\232\345\200\274\347\232\204\345\217\266\345\255\220\350\212\202\347\202\271/Solution.java"
new file mode 100644
index 0000000..88e89d9
--- /dev/null
+++ "b/src/\351\200\222\345\275\222/q1325_\345\210\240\351\231\244\347\273\231\345\256\232\345\200\274\347\232\204\345\217\266\345\255\220\350\212\202\347\202\271/Solution.java"
@@ -0,0 +1,21 @@
+package 递归.q1325_删除给定值的叶子节点;
+
+/**
+ * 递归 o(n)
+ */
+public class Solution {
+
+ public TreeNode removeLeafNodes(TreeNode root, int target) {
+ if (root == null) {
+ return null;
+ }
+
+ root.left = removeLeafNodes(root.left, target);
+ root.right = removeLeafNodes(root.right, target);
+
+ if (root.val == target && root.left == null && root.right == null) {
+ return null;
+ }
+ return root;
+ }
+}
diff --git "a/src/\351\200\222\345\275\222/q1325_\345\210\240\351\231\244\347\273\231\345\256\232\345\200\274\347\232\204\345\217\266\345\255\220\350\212\202\347\202\271/TreeNode.java" "b/src/\351\200\222\345\275\222/q1325_\345\210\240\351\231\244\347\273\231\345\256\232\345\200\274\347\232\204\345\217\266\345\255\220\350\212\202\347\202\271/TreeNode.java"
new file mode 100644
index 0000000..3101161
--- /dev/null
+++ "b/src/\351\200\222\345\275\222/q1325_\345\210\240\351\231\244\347\273\231\345\256\232\345\200\274\347\232\204\345\217\266\345\255\220\350\212\202\347\202\271/TreeNode.java"
@@ -0,0 +1,20 @@
+package 递归.q1325_删除给定值的叶子节点;
+
+public class TreeNode {
+ int val;
+ TreeNode left;
+ TreeNode right;
+
+ TreeNode() {
+ }
+
+ TreeNode(int val) {
+ this.val = val;
+ }
+
+ TreeNode(int val, TreeNode left, TreeNode right) {
+ this.val = val;
+ this.left = left;
+ this.right = right;
+ }
+}
diff --git "a/src/\351\223\276\350\241\250\346\223\215\344\275\234/q160_\347\233\270\344\272\244\351\223\276\350\241\250/ListNode.java" "b/src/\351\223\276\350\241\250\346\223\215\344\275\234/q160_\347\233\270\344\272\244\351\223\276\350\241\250/ListNode.java"
new file mode 100644
index 0000000..f3da319
--- /dev/null
+++ "b/src/\351\223\276\350\241\250\346\223\215\344\275\234/q160_\347\233\270\344\272\244\351\223\276\350\241\250/ListNode.java"
@@ -0,0 +1,11 @@
+package 链表操作.q160_相交链表;
+
+public class ListNode {
+ int val;
+ ListNode next;
+
+ ListNode(int x) {
+ val = x;
+ next = null;
+ }
+}
diff --git "a/src/\351\223\276\350\241\250\346\223\215\344\275\234/q160_\347\233\270\344\272\244\351\223\276\350\241\250/Solution.java" "b/src/\351\223\276\350\241\250\346\223\215\344\275\234/q160_\347\233\270\344\272\244\351\223\276\350\241\250/Solution.java"
new file mode 100644
index 0000000..8009847
--- /dev/null
+++ "b/src/\351\223\276\350\241\250\346\223\215\344\275\234/q160_\347\233\270\344\272\244\351\223\276\350\241\250/Solution.java"
@@ -0,0 +1,28 @@
+package 链表操作.q160_相交链表;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * 哈希存储
+ *
+ * 方法二:两个链表相连,快慢指针判断是否有环(省略)
+ */
+public class Solution {
+ public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
+ Set visited = new HashSet<>();
+ ListNode temp = headA;
+ while (temp != null) {
+ visited.add(temp);
+ temp = temp.next;
+ }
+ temp = headB;
+ while (temp != null) {
+ if (visited.contains(temp)) {
+ return temp;
+ }
+ temp = temp.next;
+ }
+ return null;
+ }
+}
diff --git "a/src/\351\223\276\350\241\250\346\223\215\344\275\234/q206_\345\217\215\350\275\254\351\223\276\350\241\250/f1/Solution.java" "b/src/\351\223\276\350\241\250\346\223\215\344\275\234/q206_\345\217\215\350\275\254\351\223\276\350\241\250/f1/Solution.java"
index 8e21915..bcd4a1c 100644
--- "a/src/\351\223\276\350\241\250\346\223\215\344\275\234/q206_\345\217\215\350\275\254\351\223\276\350\241\250/f1/Solution.java"
+++ "b/src/\351\223\276\350\241\250\346\223\215\344\275\234/q206_\345\217\215\350\275\254\351\223\276\350\241\250/f1/Solution.java"
@@ -1,28 +1,19 @@
package 链表操作.q206_反转链表.f1;
-import java.util.ArrayList;
-import java.util.List;
-
/**
- * 暴力法舍弃空间 o(n)
+ * 遍历直接反向修改next指针 o(n)
*/
class Solution {
+
public ListNode reverseList(ListNode head) {
- if (head == null || head.next == null) {
- return head;
- }
- List list = new ArrayList<>();
+ ListNode pre = null;
ListNode temp = head;
while (temp != null) {
- list.add(temp.val);
- temp = temp.next;
- }
- ListNode rs = new ListNode(list.get(list.size() - 1));
- ListNode t1 = rs;
- for (int i = list.size() - 2; i >= 0; i--) {
- t1.next = new ListNode(list.get(i));
- t1 = t1.next;
+ ListNode t = temp.next;
+ temp.next = pre;
+ pre = temp;
+ temp = t;
}
- return rs;
+ return pre;
}
}
diff --git "a/src/\351\223\276\350\241\250\346\223\215\344\275\234/q206_\345\217\215\350\275\254\351\223\276\350\241\250/f2/Solution.java" "b/src/\351\223\276\350\241\250\346\223\215\344\275\234/q206_\345\217\215\350\275\254\351\223\276\350\241\250/f2/Solution.java"
index d65acaf..479ed78 100644
--- "a/src/\351\223\276\350\241\250\346\223\215\344\275\234/q206_\345\217\215\350\275\254\351\223\276\350\241\250/f2/Solution.java"
+++ "b/src/\351\223\276\350\241\250\346\223\215\344\275\234/q206_\345\217\215\350\275\254\351\223\276\350\241\250/f2/Solution.java"
@@ -1,18 +1,17 @@
package 链表操作.q206_反转链表.f2;
/**
- * 遍历直接反向修改next指针 o(n)
+ * 递归法 o(n)
*/
class Solution {
+
public ListNode reverseList(ListNode head) {
- ListNode pre = null;
- ListNode temp = head;
- while (temp != null) {
- ListNode t = temp.next;
- temp.next = pre;
- pre = temp;
- temp = t;
+ if (head == null || head.next == null) {
+ return head;
}
- return pre;
+ ListNode p = reverseList(head.next);
+ head.next.next = head;
+ head.next = null;
+ return p;
}
}
diff --git "a/src/\351\223\276\350\241\250\346\223\215\344\275\234/q25_k\344\270\252\344\270\200\347\273\204\347\277\273\350\275\254\351\223\276\350\241\250/ListNode.java" "b/src/\351\223\276\350\241\250\346\223\215\344\275\234/q25_k\344\270\252\344\270\200\347\273\204\347\277\273\350\275\254\351\223\276\350\241\250/ListNode.java"
new file mode 100644
index 0000000..8c6845a
--- /dev/null
+++ "b/src/\351\223\276\350\241\250\346\223\215\344\275\234/q25_k\344\270\252\344\270\200\347\273\204\347\277\273\350\275\254\351\223\276\350\241\250/ListNode.java"
@@ -0,0 +1,12 @@
+package 链表操作.q25_k个一组翻转链表;
+
+
+public class ListNode {
+ int val;
+ ListNode next;
+
+ ListNode(int x) {
+ val = x;
+ }
+}
+
diff --git "a/src/\351\223\276\350\241\250\346\223\215\344\275\234/q25_k\344\270\252\344\270\200\347\273\204\347\277\273\350\275\254\351\223\276\350\241\250/Solution.java" "b/src/\351\223\276\350\241\250\346\223\215\344\275\234/q25_k\344\270\252\344\270\200\347\273\204\347\277\273\350\275\254\351\223\276\350\241\250/Solution.java"
new file mode 100644
index 0000000..ab4fe58
--- /dev/null
+++ "b/src/\351\223\276\350\241\250\346\223\215\344\275\234/q25_k\344\270\252\344\270\200\347\273\204\347\277\273\350\275\254\351\223\276\350\241\250/Solution.java"
@@ -0,0 +1,45 @@
+package 链表操作.q25_k个一组翻转链表;
+
+/**
+ * 难点在于返回每个部分被修改的头节点,新建一个头节点的前置节点 o(n)
+ */
+public class Solution {
+
+ public ListNode reverseKGroup(ListNode head, int k) {
+ ListNode hair = new ListNode(0);
+ hair.next = head;
+
+ ListNode pre = hair;
+ ListNode end = hair;
+
+ while (end.next != null) {
+ for (int i = 0; i < k && end != null; i++){
+ end = end.next;
+ }
+ if (end == null){
+ break;
+ }
+ ListNode start = pre.next;
+ ListNode next = end.next;
+ end.next = null;
+ pre.next = reverse(start);
+ start.next = next;
+ pre = start;
+
+ end = pre;
+ }
+ return hair.next;
+ }
+
+ private ListNode reverse(ListNode head) {
+ ListNode pre = null;
+ ListNode curr = head;
+ while (curr != null) {
+ ListNode next = curr.next;
+ curr.next = pre;
+ pre = curr;
+ curr = next;
+ }
+ return pre;
+ }
+}