diff --git a/algorithm/pom.xml b/algorithm/pom.xml
new file mode 100644
index 0000000..629cdd0
--- /dev/null
+++ b/algorithm/pom.xml
@@ -0,0 +1,38 @@
+
+
+ 4.0.0
+
+ com.andy
+ leetcode
+ 1.0-SNAPSHOT
+
+
+ org.testng
+ testng
+ 7.6.1
+ test
+
+
+ JUNIT
+ JUNIT
+ 4.12
+ test
+
+
+ org.apache.commons
+ commons-lang3
+ 3.12.0
+ compile
+
+
+ JUNIT
+ JUNIT
+ 4.12
+ compile
+
+
+
+
+
\ No newline at end of file
diff --git a/algorithm/src/main/java/BFS_DFS/BinaryTreeLevelOrderTraversal.java b/algorithm/src/main/java/BFS_DFS/BinaryTreeLevelOrderTraversal.java
new file mode 100644
index 0000000..a6a5e2e
--- /dev/null
+++ b/algorithm/src/main/java/BFS_DFS/BinaryTreeLevelOrderTraversal.java
@@ -0,0 +1,49 @@
+package BFS_DFS;
+
+import binaryTree.TreeNode;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.PriorityQueue;
+import java.util.Queue;
+
+/**
+ * 102. 二叉树层序遍历
+ */
+
+public class BinaryTreeLevelOrderTraversal {
+
+ public ArrayList> binaryTreeLevelOrderTraversal(TreeNode root) {
+ ArrayList> res = new ArrayList<>();
+
+ // 设置一个队列,队列中存放根节点
+ Queue queue = new LinkedList<>();
+ queue.offer(root);
+
+ while(!queue.isEmpty()) {
+ int size = queue.size();
+ // 将当前队列中的所有节点向四周扩散
+ ArrayList temp = new ArrayList<>();
+ for(int i=0; i> binaryTreeLevelOrderTraverseII(TreeNode root) {
+ ArrayList> res = new ArrayList<>();
+
+ Queue queue = new LinkedList<>();
+ queue.offer(root);
+
+ while(!queue.isEmpty()) {
+ int size = queue.size();
+ ArrayList temp = new ArrayList<>();
+
+ for(int i=0; i> binaryTreeZigzagLevelOrderTraversal(TreeNode root) {
+ ArrayList> res = new ArrayList<>();
+
+ if(root==null) {
+ return res;
+ }
+
+ Queue queue = new LinkedList<>();
+ queue.offer(root);
+ // 用于记录遍历方向
+ boolean leftToRight = false;
+ while(!queue.isEmpty()) {
+ int size = queue.size();
+
+ ArrayList temp = new ArrayList<>();
+
+ for(int i=0; i=grid.length || j>=grid[0].length) {
+ return;
+ }
+
+ if(grid[i][j]==0) {
+ return;
+ }
+
+ grid[i][j]=0;
+ dfs(i-1, j, grid);
+ dfs(i+1, j, grid);
+ dfs(i,j-1, grid);
+ dfs(i, j+1, grid);
+
+ }
+}
diff --git a/algorithm/src/main/java/BFS_DFS/MaxAreaIsland.java b/algorithm/src/main/java/BFS_DFS/MaxAreaIsland.java
new file mode 100644
index 0000000..5528dfc
--- /dev/null
+++ b/algorithm/src/main/java/BFS_DFS/MaxAreaIsland.java
@@ -0,0 +1,44 @@
+package BFS_DFS;
+
+/**
+ * 695 岛屿最大面积
+ */
+
+public class MaxAreaIsland {
+
+ int area = 0;
+
+ public int maxAreaIsland(int[][] grid) {
+ int res=0;
+ for(int i=0; i=grid.length || j>=grid[0].length) {
+ return;
+ }
+
+ if(grid[i][j]==0) {
+ return;
+ }
+
+ grid[i][j]=0;
+ area += 1;
+ dfs(i-1, j, grid);
+ dfs(i+1, j, grid);
+ dfs(i, j-1, grid);
+ dfs(i, j+1, grid);
+ }
+
+
+}
diff --git a/algorithm/src/main/java/BFS_DFS/MinimumDepthBinaryTree.java b/algorithm/src/main/java/BFS_DFS/MinimumDepthBinaryTree.java
new file mode 100644
index 0000000..0feea89
--- /dev/null
+++ b/algorithm/src/main/java/BFS_DFS/MinimumDepthBinaryTree.java
@@ -0,0 +1,40 @@
+package BFS_DFS;
+
+import binaryTree.TreeNode;
+
+import java.util.LinkedList;
+import java.util.Queue;
+
+/**
+ * 111. 二叉树的最小深度
+ */
+
+public class MinimumDepthBinaryTree {
+
+ public int minimumDepthBinaryTree(TreeNode root) {
+ int res = 0;
+
+ if(root==null) {
+ return res;
+ }
+
+ Queue queue = new LinkedList<>();
+ queue.offer(root);
+ res += 1;
+
+ while (!queue.isEmpty()) {
+ int sz = queue.size();
+
+ for(int i=0; i=grid.length || j>=grid[0].length) {
+ return;
+ }
+
+ // 海水
+ if(grid[i][j]==1) {
+ return;
+ }
+
+ grid[i][j]=1;
+ dfs(i-1, j, grid);
+ dfs(i+1, j, grid);
+ dfs(i, j-1, grid);
+ dfs(i, j+1, grid);
+ }
+}
diff --git a/algorithm/src/main/java/BFS_DFS/NumberDistinctIslands.java b/algorithm/src/main/java/BFS_DFS/NumberDistinctIslands.java
new file mode 100644
index 0000000..009716b
--- /dev/null
+++ b/algorithm/src/main/java/BFS_DFS/NumberDistinctIslands.java
@@ -0,0 +1,59 @@
+package BFS_DFS;
+
+import java.util.ArrayList;
+
+/**
+ * 694 不同的岛屿数量
+ */
+
+public class NumberDistinctIslands {
+
+ public int numberDistinctIslands(char[][] grid) {
+ int res = 0;
+ ArrayList shape = new ArrayList<>();
+ StringBuilder temp = new StringBuilder();
+ for(int i=0; i=grid.length || j>=grid[0].length) {
+ return;
+ }
+ if(grid[i][j]=='0') {
+ return;
+ }
+
+ // 记录外形
+ s.append(dir);
+
+ grid[i][j]='0';
+ dfs(i-1, j, grid, s, "1");
+ dfs(i+1, j, grid, s, "2");
+ dfs(i, j-1, grid, s, "3");
+ dfs(i, j+1, grid, s, "4");
+
+ }
+
+ boolean contain(String s, ArrayList shape) {
+ for(String t: shape) {
+ if(t.equals(s)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+}
diff --git a/algorithm/src/main/java/BFS_DFS/NumberEnclaves.java b/algorithm/src/main/java/BFS_DFS/NumberEnclaves.java
new file mode 100644
index 0000000..ef87c27
--- /dev/null
+++ b/algorithm/src/main/java/BFS_DFS/NumberEnclaves.java
@@ -0,0 +1,54 @@
+package BFS_DFS;
+
+/**
+ * 1020 飞地的数量
+ */
+
+public class NumberEnclaves {
+
+ int res = 0;
+
+ public int numberEnclaves(int[][] grid) {
+
+ int m=grid.length, n=grid[0].length;
+
+
+ for(int i=0; i=grid.length || j>=grid[0].length) {
+ return;
+ }
+
+ if(grid[i][j]==0) {
+ return;
+ }
+
+
+ grid[i][j] = 0;
+ res += 1;
+ dfs(i, j-1, grid); // 上
+ dfs(i, j+1, grid); // 下
+ dfs(i-1, j, grid); // 左
+ dfs(i+1, j, grid); // 右
+
+
+ }
+}
diff --git a/algorithm/src/main/java/BFS_DFS/NumberIslands.java b/algorithm/src/main/java/BFS_DFS/NumberIslands.java
new file mode 100644
index 0000000..1431bd5
--- /dev/null
+++ b/algorithm/src/main/java/BFS_DFS/NumberIslands.java
@@ -0,0 +1,41 @@
+package BFS_DFS;
+
+/**
+ * 200 岛屿数量
+ */
+
+public class NumberIslands {
+
+ public int numberIslands(char[][] grid) {
+ int res = 0;
+
+ for(int i=0; i=grid.length || j>=grid[0].length) {
+ return;
+ }
+
+ if(grid[i][j]=='0') {
+ return;
+ }
+
+ grid[i][j]='0';
+ dfs(i-1,j,grid);
+ dfs(i+1, j, grid);
+ dfs(i, j-1, grid);
+ dfs(i, j+1, grid);
+ }
+
+
+}
diff --git a/algorithm/src/main/java/BFS_DFS/OpenTheLock.java b/algorithm/src/main/java/BFS_DFS/OpenTheLock.java
new file mode 100644
index 0000000..a4782d9
--- /dev/null
+++ b/algorithm/src/main/java/BFS_DFS/OpenTheLock.java
@@ -0,0 +1,70 @@
+package BFS_DFS;
+
+import java.util.*;
+
+/**
+ * 752. 打开转盘锁
+ */
+
+public class OpenTheLock {
+
+ public int openTheLock(ArrayList depends, String target) {
+ int res = 0;
+ Queue queue = new LinkedList<>();
+ Set visited = new HashSet<>(depends);
+ queue.add("0000");
+
+ while (!queue.isEmpty()) {
+ int sz = queue.size();
+
+ for(int i=0; i queue = new LinkedList<>();
+ Set visited = new HashSet<>();
+ String target = "123450";
+ StringBuilder sb = new StringBuilder();
+ for(int i=0;i0) {
+ String sLeft = swap(cur, index, index-1);
+ queue.add(sLeft);
+ }
+ // 右交换
+ if(col0) {
+ String sTop = swap(cur, index, index-nums[0].length);
+ queue.add(sTop);
+ }
+
+ // 下交换
+ if(row=m || col>=n) {
+ // 超出搜索边界
+ return;
+ }
+
+ if(board[row][col]=='X') {
+ // 已经是海水
+ return;
+ }
+ // 将(row, col)变成海水,标记为 #
+ board[row][col] = '#';
+ // 淹没上下左右陆地
+ dfs(row+1, col, board);
+ dfs(row, col+1, board);
+ dfs(row-1, col, board);
+ dfs(row-1, col-1, board);
+ }
+
+
+
+
+}
diff --git a/algorithm/src/main/java/DP/BloodSimilarity.java b/algorithm/src/main/java/DP/BloodSimilarity.java
new file mode 100644
index 0000000..b34a4af
--- /dev/null
+++ b/algorithm/src/main/java/DP/BloodSimilarity.java
@@ -0,0 +1,42 @@
+package DP;
+
+import java.util.Scanner;
+
+/**
+ * 字节跳动 -- 古生物血缘远近判定
+ */
+
+public class BloodSimilarity {
+
+ public int bloodSimilarity(String str1, String str2){
+ int res = 0;
+
+ res = traverse(str1, 0, str2, 0, 0);
+ return res;
+ }
+
+ int traverse(String str1, int pos1, String str2, int pos2, int res){
+ if(pos1==str1.length()) {
+ return res+str2.length()-pos2;
+ }else if(pos2==str2.length()){
+ return res+str1.length()-pos1;
+ }
+
+ if(str1.charAt(pos1)==str2.charAt(pos2)) {
+ return traverse(str1, pos1+1, str2, pos2+1, res);
+ }
+
+ int res1 = traverse(str1, pos1+1, str2, pos2, res+1);
+ int res2 = traverse(str1, pos1, str2, pos2+1, res+1);
+ int res3 = traverse(str1, pos1+1, str2, pos2+1, res+1);
+ return Math.min(res1, Math.min(res2, res3));
+ }
+
+ public static void main(String[] args) {
+ Scanner sc = new Scanner(System.in);
+ String[] strs = sc.nextLine().trim().split(",");
+ BloodSimilarity solver = new BloodSimilarity();
+ int res = solver.bloodSimilarity(strs[0], strs[1]);
+ System.out.print(res);
+ }
+}
diff --git a/algorithm/src/main/java/DP/DisjointLines.java b/algorithm/src/main/java/DP/DisjointLines.java
new file mode 100644
index 0000000..873003a
--- /dev/null
+++ b/algorithm/src/main/java/DP/DisjointLines.java
@@ -0,0 +1,41 @@
+package DP;
+
+import java.util.Arrays;
+import java.util.HashMap;
+
+/**
+ * 1035 不相交的线
+ */
+
+public class DisjointLines {
+ public int maxUncrossedLines(int[] nums1, int[] nums2) {
+ int res=0;
+ int[][] memo = new int[nums1.length][nums2.length];
+ for(int[] ints: memo){
+ Arrays.fill(ints,-1);
+ }
+
+ res = dp(nums1, nums1.length-1, nums2, nums2.length-1, memo);
+ return res;
+ }
+
+ int dp(int[] nums1, int p1, int[] nums2, int p2, int[][] memo){
+ if(p1<0 || p2<0) {
+ return 0;
+ }
+
+ if(memo[p1][p2]!=-1) {
+ return memo[p1][p2];
+ }
+ if(nums1[p1]==nums2[p2]) {
+ memo[p1][p2] = dp(nums1, p1-1, nums2, p2-1, memo)+1;
+ }else {
+ memo[p1][p2] = Math.max(
+ dp(nums1, p1-1, nums2, p2, memo),
+ dp(nums1, p1, nums2, p2-1, memo)
+ );
+ }
+
+ return memo[p1][p2];
+ }
+}
diff --git a/algorithm/src/main/java/DP/Envelops.java b/algorithm/src/main/java/DP/Envelops.java
new file mode 100644
index 0000000..ceb488e
--- /dev/null
+++ b/algorithm/src/main/java/DP/Envelops.java
@@ -0,0 +1,28 @@
+package DP;
+
+import java.util.Arrays;
+import java.util.Comparator;
+
+/**
+ * 354. 俄罗斯套娃信封问题
+ *
+ * 思路:对信封进行排序。先比较width,width相同则比较height
+ */
+
+public class Envelops {
+
+ public int maxEnvelops(int[][] envelops) {
+ int res = 0;
+ // 对二维数组进行排序
+ Arrays.sort(envelops, new Comparator() {
+ public int compare(int[] a, int[] b) {
+ if(a[0]==b[0]) {
+ return a[1]-b[1];
+ }
+ return a[0]-b[0];
+ }
+ });
+
+ return res;
+ }
+}
diff --git a/algorithm/src/main/java/DP/IsSubsequence.java b/algorithm/src/main/java/DP/IsSubsequence.java
new file mode 100644
index 0000000..91a51eb
--- /dev/null
+++ b/algorithm/src/main/java/DP/IsSubsequence.java
@@ -0,0 +1,27 @@
+package DP;
+
+/**
+ * 392 判断子序列
+ */
+
+public class IsSubsequence {
+
+ public boolean isSubsequence(String s, String t) {
+ boolean res = true;
+ res = dp(s, s.length()-1, t, t.length()-1);
+ return res;
+ }
+
+ boolean dp(String s, int p1, String t, int p2){
+ if(p1<0){
+ return true;
+ }else if(p2<0){
+ return false;
+ }
+ if(s.charAt(p1)==t.charAt(p2)){
+ return dp(s, p1-1, t, p2-1);
+ }else {
+ return dp(s, p1, t, p2-1);
+ }
+ }
+}
\ No newline at end of file
diff --git a/algorithm/src/main/java/DP/LongestCommonSubsequence.java b/algorithm/src/main/java/DP/LongestCommonSubsequence.java
new file mode 100644
index 0000000..dd13986
--- /dev/null
+++ b/algorithm/src/main/java/DP/LongestCommonSubsequence.java
@@ -0,0 +1,25 @@
+package DP;
+
+/**
+ * 1143 最长公共子序列
+ */
+
+public class LongestCommonSubsequence {
+
+ public int longestCommonSubsequence(String text1, String text2){
+ int res = 0;
+ res = dp(text1, 0, text2, 0);
+
+ return res;
+ }
+
+ int dp(String text1, int p1, String text2, int p2){
+ if(p1>=text1.length() || p2>=text2.length()) {
+ return 0;
+ }
+ if(text1.charAt(p1)==text2.charAt(p2)){
+ return dp(text1, p1+1, text2, p2+1)+1;
+ }
+ return Math.max(dp(text1, p1+1, text2, p2), dp(text1, p1, text2, p2+1));
+ }
+}
diff --git a/algorithm/src/main/java/DP/LongestCommonSubsequenceII.java b/algorithm/src/main/java/DP/LongestCommonSubsequenceII.java
new file mode 100644
index 0000000..06dd809
--- /dev/null
+++ b/algorithm/src/main/java/DP/LongestCommonSubsequenceII.java
@@ -0,0 +1,40 @@
+package DP;
+
+import java.util.Arrays;
+
+/**
+ * 1143 最长公共子序列
+ */
+
+public class LongestCommonSubsequenceII {
+
+ public int longestCommonSubsequence(String text1, String text2){
+ int res = 0;
+ int[][] memo = new int[text1.length()][text2.length()];
+ for (int[] ints : memo) {
+ Arrays.fill(ints, -1);
+ }
+ res = dp(text1, text1.length()-1, text2, text2.length()-1, memo);
+
+ return res;
+ }
+
+ int dp(String text1, int p1, String text2, int p2, int[][] memo){
+ if(p1<0 || p2<0) {
+ return 0;
+ }
+ // 查询备忘录中是否存在数据
+ if(memo[p1][p2]!=-1){
+ return memo[p1][p2];
+ }
+
+ if(text1.charAt(p1)==text2.charAt(p2)){
+ memo[p1][p2] = dp(text1, p1-1, text2, p2-1, memo)+1;
+ }else {
+ memo[p1][p2] = Math.max(dp(text1, p1 - 1, text2, p2, memo),
+ dp(text1, p1, text2, p2 - 1, memo)
+ );
+ }
+ return memo[p1][p2];
+ }
+}
diff --git a/algorithm/src/main/java/DP/MinFallingPathSum.java b/algorithm/src/main/java/DP/MinFallingPathSum.java
new file mode 100644
index 0000000..d5ebe63
--- /dev/null
+++ b/algorithm/src/main/java/DP/MinFallingPathSum.java
@@ -0,0 +1,65 @@
+package DP;
+
+import java.util.Arrays;
+
+/**
+ * 931 最小下降和
+ */
+
+public class MinFallingPathSum {
+
+ public int minFallingPathSum(int[][] matrix) {
+ int res = Integer.MAX_VALUE;
+ int[][] memo = new int[matrix.length][matrix[0].length]; // 创建备忘录
+ for(int[] t: memo) {
+ Arrays.fill(t, Integer.MAX_VALUE);
+ }
+
+ dp(matrix.length-1, matrix[0].length-1, matrix, memo);
+ for(int i=0; i1) {
+ memo[row][i] = Math.min(dp(row - 1, i, matrix, memo), dp(row - 1, i + 1, matrix, memo))+matrix[row][i];
+ }else{
+ // 列数为1列
+ memo[row][i] = dp(row-1, i, matrix, memo)+ matrix[row][i];
+ }
+ }else if(i+1==matrix[0].length) {
+ // 最后一列(默认列数大于1)
+ memo[row][i] = Math.min(dp(row-1, i-1, matrix, memo), dp(row-1, i, matrix, memo))+matrix[row][i];
+ }else {
+ memo[row][i] = Math.min(
+ dp(row - 1, i - 1, matrix, memo),
+ Math.min(
+ dp(row - 1, i, matrix, memo),
+ dp(row - 1, i + 1, matrix, memo)
+ )
+ ) + matrix[row][i];
+ }
+
+ }
+ return memo[row][col];
+ }
+
+
+}
diff --git a/algorithm/src/main/java/DP/MinFallingPathSum2.java b/algorithm/src/main/java/DP/MinFallingPathSum2.java
new file mode 100644
index 0000000..bb6359b
--- /dev/null
+++ b/algorithm/src/main/java/DP/MinFallingPathSum2.java
@@ -0,0 +1,49 @@
+package DP;
+
+import java.util.Arrays;
+
+/**
+ * 1289. 下降路径最小和II
+ */
+
+public class MinFallingPathSum2 {
+ public int minFallingPathSum(int[][] grid) {
+ int res = Integer.MAX_VALUE;
+ int[][] memo = new int[grid.length][grid[0].length];
+ for(int[] t: memo) {
+ Arrays.fill(t, Integer.MAX_VALUE);
+ }
+ dp(grid.length-1, grid[0].length-1, grid, memo);
+ for(int i=0; i1 && i>0){
+ temp = Math.min(temp, dp(row-1, i-1, matrix, memo));
+ }
+ // 列数大于1,且未到达最右侧,那么比较
+ if(matrix[0].length>1 && i+1> triangle) {
+ int res = 0;
+ int[][] memo = new int[triangle.size()][triangle.size()];
+ for(int[] t: memo){
+ Arrays.fill(t, 666);
+ }
+
+// memo[0][0] = triangle.get(0).get(0);
+ res = dp(triangle.size()-1, triangle.size()-1, memo, triangle);
+ for(int i=0; i> triangle) {
+ if(row<0 || col<0) {
+ return 0;
+ }
+
+ if(memo[row][col]!=666) {
+ return memo[row][col];
+ }
+
+ for(int i=0; i<=row; i++) {
+ // 处于最左侧
+ if (i == 0) {
+ memo[row][i] = dp(row-1, i, memo, triangle)+triangle.get(row).get(i);
+ } else if (i == row) {
+ // 处于最右侧
+ memo[row][i] = dp(row - 1, i-1, memo, triangle) + triangle.get(row).get(i);
+ } else {
+ // 取最小值
+ memo[row][i] = Math.min(
+ dp(row - 1, i - 1, memo, triangle),
+ dp(row - 1, i, memo, triangle)
+ ) + triangle.get(row).get(i);
+ }
+ }
+ return memo[row][col];
+ }
+}
diff --git a/algorithm/src/main/java/DP/MinimumTriangleTotalII.java b/algorithm/src/main/java/DP/MinimumTriangleTotalII.java
new file mode 100644
index 0000000..f24663b
--- /dev/null
+++ b/algorithm/src/main/java/DP/MinimumTriangleTotalII.java
@@ -0,0 +1,47 @@
+package DP;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 120 三角形最小路径和(简化if判断语句)
+ */
+
+public class MinimumTriangleTotalII {
+ public int minimumTotal(List> triangle) {
+ int res = 0;
+ int[][] memo = new int[triangle.size()][triangle.size()];
+ for(int[] t: memo){
+ Arrays.fill(t, Integer.MAX_VALUE);
+ }
+
+ res = dp(triangle.size()-1, triangle.size()-1, memo, triangle);
+ for(int i=0; i> triangle) {
+ if(row<0 || col<0) {
+ return 0;
+ }
+
+ if(memo[row][col]!=Integer.MAX_VALUE) {
+ return memo[row][col];
+ }
+
+
+ for(int i=0; i<=row; i++) {
+ int temp = dp(row-1, i, memo, triangle);
+ if(i>0) {
+ temp = Math.min(temp, dp(row-1, i-1, memo, triangle));
+ }
+ if(i+1<=row) {
+ temp = Math.min(temp, dp(row-1, i, memo, triangle));
+ }
+ memo[row][i] = temp+triangle.get(row).get(i);
+ }
+ return memo[row][col];
+ }
+}
diff --git a/algorithm/src/main/java/DP/PalindromeList.java b/algorithm/src/main/java/DP/PalindromeList.java
new file mode 100644
index 0000000..3eea95c
--- /dev/null
+++ b/algorithm/src/main/java/DP/PalindromeList.java
@@ -0,0 +1,65 @@
+package DP;
+
+import linkedList.doublePointer.ListNode;
+
+/**
+ * 234. 回⽂链表
+ *
+ * 快慢指针
+ */
+
+
+public class PalindromeList {
+
+ public boolean palindrome(ListNode head) {
+ if(head==null) {
+ return true;
+ }
+ boolean res = true;
+ boolean even = false; // 默认为奇数
+
+ ListNode slow=head, fast=head;
+
+ // 首先获取中间节点,并判断个数的奇偶性
+ while(fast!=null && fast.next!=null) {
+ slow = slow.next;
+ if(fast.next.next==null) {
+ even = true;
+ }
+ fast = fast.next.next;
+ }
+
+ if(even) {
+ fast = slow;
+ }else {
+ fast = slow.next;
+ }
+
+ fast = reverse(fast);
+ slow = head;
+
+
+
+ // 判断是否为回文链表
+ while(fast!=null) {
+ if(slow.val!=fast.val) {
+ res = false;
+ break;
+ }
+ slow = slow.next;
+ fast = fast.next;
+ }
+
+ return res;
+ }
+
+ public ListNode reverse(ListNode head) {
+ if(head==null || head.next==null) {
+ return head;
+ }
+ ListNode last = reverse(head.next);
+ head.next.next = head;
+ head.next = null;
+ return last;
+ }
+}
diff --git a/algorithm/src/main/java/DP/ReverseNode.java b/algorithm/src/main/java/DP/ReverseNode.java
new file mode 100644
index 0000000..efd4b41
--- /dev/null
+++ b/algorithm/src/main/java/DP/ReverseNode.java
@@ -0,0 +1,18 @@
+package DP;
+
+// 反转链表
+
+import linkedList.doublePointer.ListNode;
+
+public class ReverseNode {
+
+ public ListNode reverseNode(ListNode list) {
+ if(list==null || list.next==null) {
+ return list;
+ }
+ ListNode last = reverseNode(list.next);
+ list.next.next = list;
+ list.next = null;
+ return last;
+ }
+}
diff --git a/algorithm/src/main/java/DP/ReverseNode2.java b/algorithm/src/main/java/DP/ReverseNode2.java
new file mode 100644
index 0000000..19702db
--- /dev/null
+++ b/algorithm/src/main/java/DP/ReverseNode2.java
@@ -0,0 +1,25 @@
+package DP;
+
+import linkedList.doublePointer.ListNode;
+
+/**
+ * 对题目 [206. 反转链表]的扩展
+ * 反转链表前N个节点
+ */
+
+public class ReverseNode2 {
+
+ ListNode successor = null; // 后驱节点
+
+ public ListNode reverseNode(ListNode list, int n) {
+ if(list==null || list.next==null || n<=1) {
+ successor = list.next;
+ return list;
+ }
+ ListNode last = reverseNode(list.next, n-1);
+ list.next.next = list;
+ list.next = successor;
+
+ return last;
+ }
+}
diff --git a/algorithm/src/main/java/DP/ReverseNode3.java b/algorithm/src/main/java/DP/ReverseNode3.java
new file mode 100644
index 0000000..1f8d57b
--- /dev/null
+++ b/algorithm/src/main/java/DP/ReverseNode3.java
@@ -0,0 +1,36 @@
+package DP;
+
+import linkedList.doublePointer.ListNode;
+
+public class ReverseNode3 {
+
+ private ListNode successor=null;
+
+ public ListNode reverseBetween(ListNode list, int m, int n) {
+ if(list==null || m<0 || n<0 || m>=n) {
+ return list;
+ }
+
+ ListNode p=list;
+ for(int i=0;i() {
+ @Override
+ public int compare(int[] o1, int[] o2) {
+ if(o1[0]==o2[0]) {
+ return o1[1]-o2[1];
+ }else {
+ return o2[1]-o1[1];
+ }
+ }
+ });
+
+// dp(envelopes.length-1, envelopes, memo);
+
+ return memo[envelopes.length-1];
+ }
+
+// int dp(int start, int[][] envelopes, int[] memo) {
+// if(start==0) {
+// return 1;
+// }
+//
+// if(envelopes[start][0]>envelopes[start-1][0] && envelopes[start][1]>envelopes[start-1][1]) {
+// if(memo[start-1]==0) {
+// memo[start-1] = dp(start-1, envelopes, memo);
+// }
+// memo[start]=memo[start-1]+1;
+// }else{
+//// dp
+// }
+// }
+
+
+}
diff --git a/algorithm/src/main/java/DP/UniquePathsWithObstacles.java b/algorithm/src/main/java/DP/UniquePathsWithObstacles.java
new file mode 100644
index 0000000..3f31ce9
--- /dev/null
+++ b/algorithm/src/main/java/DP/UniquePathsWithObstacles.java
@@ -0,0 +1,53 @@
+package DP;
+
+import java.util.Arrays;
+
+/**
+ * 63 不同路径II
+ */
+
+public class UniquePathsWithObstacles {
+ public int uniquePathsWithObstacles(int[][] obstacleGrid) {
+ int res = 0;
+ int[][] memo = new int[obstacleGrid.length][obstacleGrid[0].length];
+ for(int[] ints:memo) {
+ Arrays.fill(ints, -1);
+ }
+ if(obstacleGrid[0][0]==0) {
+ memo[0][0] = 1;
+ }else{
+ memo[0][0] = 0;
+ }
+// if(memo.length>1){
+// if(obstacleGrid[1][0]==0 && memo[0][0]==1) {
+// memo[1][0] = 1;
+// }else {
+// memo[1][0] = 0;
+// }
+// }
+// if(memo[0].length>1){
+// if(obstacleGrid[0][1]==0 && memo[0][0]==1) {
+// memo[0][1] = 1;
+// }else {
+// memo[0][1] = 0;
+// }
+// }
+ res = dp(memo.length-1, memo[0].length-1, memo, obstacleGrid);
+
+
+ return res;
+ }
+
+ int dp(int row, int col, int[][] memo, int[][] obs){
+ if(row<0 || col<0 || obs[row][col]==1) {
+ return 0;
+ }
+
+ if(memo[row][col]!=-1) {
+ return memo[row][col];
+ }
+
+ memo[row][col] = dp(row-1, col,memo, obs) + dp(row, col-1, memo, obs);
+ return memo[row][col];
+ }
+}
diff --git a/algorithm/src/main/java/alibaba/DuplicateLength.java b/algorithm/src/main/java/alibaba/DuplicateLength.java
new file mode 100644
index 0000000..003d282
--- /dev/null
+++ b/algorithm/src/main/java/alibaba/DuplicateLength.java
@@ -0,0 +1,30 @@
+package alibaba;
+
+import java.util.HashMap;
+
+public class DuplicateLength {
+
+ int duplicateLength(String str) {
+ int res = -1;
+
+ HashMap map = new HashMap<>();
+ int pos=0;
+
+ // 移动位置
+ while(pos {
+ p.printABC("B", 1);
+ });
+
+ Thread thread3 = new Thread(() -> {
+ p.printABC("C", 2);
+ });
+
+ thread1.start();
+ thread2.start();
+ thread3.start();
+ }
+}
\ No newline at end of file
diff --git a/algorithm/src/main/java/alibaba/ThreadPrintABC2.java b/algorithm/src/main/java/alibaba/ThreadPrintABC2.java
new file mode 100644
index 0000000..dc7e9fb
--- /dev/null
+++ b/algorithm/src/main/java/alibaba/ThreadPrintABC2.java
@@ -0,0 +1,48 @@
+package alibaba;
+
+import java.util.concurrent.locks.ReentrantLock;
+
+public class ThreadPrintABC2 {
+ int size;
+ int state;
+ int count;
+
+ ReentrantLock lock = new ReentrantLock();
+
+ public ThreadPrintABC2(int size, int group) {
+ this.size = size;
+ this.count = size*group;
+ }
+
+ public void printABC(String s, int nums, int val) {
+ while(state {
+ p.printABC("AA", 1, 0);
+ }).start();
+
+ new Thread(() -> {
+ p.printABC("BB", 2, 1);
+ }).start();
+
+ new Thread(() -> {
+ p.printABC("CC", 3, 2);
+ }).start();
+ }
+}
diff --git a/algorithm/src/main/java/alibaba/ThreadPrintCharNum.java b/algorithm/src/main/java/alibaba/ThreadPrintCharNum.java
new file mode 100644
index 0000000..15ec719
--- /dev/null
+++ b/algorithm/src/main/java/alibaba/ThreadPrintCharNum.java
@@ -0,0 +1,56 @@
+package alibaba;
+
+import java.util.concurrent.locks.ReentrantLock;
+
+public class ThreadPrintCharNum {
+ int size;
+ int count;
+ int state;
+ int n=1;
+ char c = 'A';
+ ReentrantLock lock = new ReentrantLock();
+
+ public ThreadPrintCharNum(int size, int group) {
+ this.size = size;
+ this.count = size*group;
+ }
+
+ public void printNum(int val) {
+ while (state
+ p.printNum(0)
+ ).start();
+
+
+ new Thread(() -> {
+ p.printChar(1);
+ }).start();
+
+ }
+}
diff --git a/algorithm/src/main/java/alibaba/ThreadPrintNums.java b/algorithm/src/main/java/alibaba/ThreadPrintNums.java
new file mode 100644
index 0000000..8506ee9
--- /dev/null
+++ b/algorithm/src/main/java/alibaba/ThreadPrintNums.java
@@ -0,0 +1,46 @@
+package alibaba;
+
+import java.util.concurrent.locks.ReentrantLock;
+
+public class ThreadPrintNums {
+ int size;
+ int state;
+ ReentrantLock lock = new ReentrantLock();
+
+ public ThreadPrintNums(int nums) {
+ this.size = size;
+ }
+
+ void printNum(int val) {
+ while (state <= 100) {
+ lock.lock();
+ if(state<=100 && state%2==val) {
+ System.out.println(state);
+ state += 1;
+ }
+ lock.unlock();
+ }
+ }
+
+
+ public static void main(String[] args) {
+ ThreadPrintNums p = new ThreadPrintNums(100);
+
+ // 打印奇数
+ new Thread(
+ () -> {
+ p.printNum(0);
+ }
+ ).start();
+
+ // 打印偶数
+ new Thread(
+ () -> {
+ p.printNum(1);
+ }
+ ).start();
+
+
+ }
+}
+
diff --git a/algorithm/src/main/java/array/binarySearch/EatBanana.java b/algorithm/src/main/java/array/binarySearch/EatBanana.java
new file mode 100644
index 0000000..8ed88e4
--- /dev/null
+++ b/algorithm/src/main/java/array/binarySearch/EatBanana.java
@@ -0,0 +1,55 @@
+package array.binarySearch;
+
+public class EatBanana {
+
+ public int eatBanana(int[] piles, int hour) {
+ if(piles.length==0) {
+ return -1;
+ }
+ if(piles.length==1) {
+ return (piles[0]+hour-1)/hour;
+ }
+
+ int sum = 0;
+ for(int t: piles) {
+ sum += t;
+ }
+
+ int left = sum/hour;
+ int right = sum;
+ while(left<=right) {
+ int mid = (left+right)>>1;
+ int h = calHour(piles, mid);
+ if(h==hour) {
+ left=mid;
+ break;
+ }else if(h0) {
+ if(calHour(piles, left-1)<=hour) {
+ left-=1;
+ }else {
+ break;
+ }
+ }
+
+ return left;
+ }
+
+ private int calHour(int[] piles, int speed) {
+ int hour = 0;
+ for(int i=0;i0) {
+ hour += 1;
+ }
+ }
+ return hour;
+ }
+}
diff --git a/algorithm/src/main/java/array/binarySearch/IsSubsequence.java b/algorithm/src/main/java/array/binarySearch/IsSubsequence.java
new file mode 100644
index 0000000..37bd4ba
--- /dev/null
+++ b/algorithm/src/main/java/array/binarySearch/IsSubsequence.java
@@ -0,0 +1,29 @@
+package array.binarySearch;
+
+/**
+ * 392.判断子序列
+ */
+
+public class IsSubsequence {
+
+ boolean isSubsequence(String s, String t) {
+
+ boolean res = false;
+
+ int left = 0;
+ int right = 0;
+ while (left> 1;
+// if(nums[mid]>1;
+ if(nums[mid]>1;
+ long sz = tailingZeros(mid);
+ if(sz==k) {
+ found = true;
+ break;
+ }else if(k>sz) {
+ left = mid+1;
+ }else {
+ right = mid;
+ }
+ }
+ if(found) {
+ res = 5;
+ }
+ return res;
+ }
+
+ private long tailingZeros(long n) {
+ long divisor=5;
+ long res=0;
+ while(n>=divisor) {
+ res += n/divisor;
+ divisor*=5;
+ }
+ return res;
+ }
+}
diff --git a/algorithm/src/main/java/array/binarySearch/SearchInsertPosition.java b/algorithm/src/main/java/array/binarySearch/SearchInsertPosition.java
new file mode 100644
index 0000000..1b01a13
--- /dev/null
+++ b/algorithm/src/main/java/array/binarySearch/SearchInsertPosition.java
@@ -0,0 +1,71 @@
+package array.binarySearch;
+
+/**
+ * 35. 搜索插⼊位置
+ */
+
+public class SearchInsertPosition {
+
+ /**
+ * 最初写法
+ */
+// public int searchInsert(int[] nums, int target) {
+// // 处理边界问题
+// if(nums.length==0 || nums[0]>target) {
+// return 0;
+// }
+// if(nums[nums.length-1]>1;
+// if(nums[mid]>target) {
+// high = mid-1;
+// }else if(nums[mid]0 && nums[mid-1]==target) {
+// mid--;
+// }
+// return mid;
+// }
+// }
+// return mid;
+// }
+
+ /**
+ * 按照模板写法
+ */
+ public int searchInsert(int[] nums, int target) {
+ // 对参数进行处理
+ if(nums.length==0 || nums[0]>target) {
+ return 0;
+ }
+ if(nums[nums.length-1]>1;
+ if(nums[mid]0 && nums[left-1]==target) {
+ left--;
+ }
+ return left;
+ }
+
+
+}
diff --git a/algorithm/src/main/java/array/binarySearch/SearchMatrix.java b/algorithm/src/main/java/array/binarySearch/SearchMatrix.java
new file mode 100644
index 0000000..44ff2c7
--- /dev/null
+++ b/algorithm/src/main/java/array/binarySearch/SearchMatrix.java
@@ -0,0 +1,88 @@
+package array.binarySearch;
+
+/**
+ * 74. 搜索⼆维矩阵
+ */
+
+public class SearchMatrix {
+
+ /**
+ * 最初算法
+ */
+// public boolean searchMatrix(int[][] nums, int target) {
+//
+// if(nums.length==0 || nums[0].length==0) {
+// return false;
+// }
+//
+// if(nums[0][0]>target || nums[nums.length-1][nums[0].length-1]>1;
+// int m = mid/N;
+// int n = mid%N;
+// if(nums[m][n]target) {
+// high = mid-1;
+// }else {
+// res = true;
+// break;
+// }
+// }
+// if(low==high && nums[low/N][low%N]==target) {
+// res = true;
+// }
+// return res;
+// }
+
+ /**
+ * 使用框架算法
+ */
+ public boolean searchMatrix(int[][] nums, int target) {
+
+ // 参数处理
+ if(nums.length==0 || nums[0].length==0) {
+ return false;
+ }
+ if(nums[0][0]>target || nums[nums.length-1][nums[0].length-1]>1;
+ int m = mid/N;
+ int n = mid%N;
+ if(nums[m][n]> 1;
+ if(nums[mid]>1;
+ if(nums[mid]target) {
+ high = mid-1;
+ }else {
+ // 找到目标值
+ int tLeft = mid;
+ int tRight = mid;
+ // 向左边遍历,取左边界
+ while(tLeft>0 && nums[tLeft-1]==target) {
+ tLeft--;
+ }
+
+ // 向右边遍历,取右边界
+ while(tRight+1> 1;
+ if (calDays(nums, mid)>days) {
+ left = mid+1;
+
+ }else {
+ right=mid;
+ }
+ }
+ return left;
+ }
+
+ private int calDays(int[] nums, int target) {
+ int index = 0;
+ int days = 0;
+
+ while (index < nums.length) {
+ int sum = 0;
+ while (index=m) {
+ res += n/m;
+ m*=5;
+ }
+ return res;
+ }
+}
diff --git a/algorithm/src/main/java/array/other/AdvantageShuffle.java b/algorithm/src/main/java/array/other/AdvantageShuffle.java
new file mode 100644
index 0000000..5028f5f
--- /dev/null
+++ b/algorithm/src/main/java/array/other/AdvantageShuffle.java
@@ -0,0 +1,49 @@
+package array.other;
+
+import java.util.*;
+
+/**
+ * 870 优势洗牌
+ */
+
+public class AdvantageShuffle {
+
+ public int[] advantageShuffle(int[] nums1, int[] nums2) {
+ int[] res = new int[nums1.length];
+ PriorityQueue> queue = new PriorityQueue<>(
+ (ArrayListt1, ArrayListt2) -> {
+ // 从大到小排序
+ return t2.get(1)-t1.get(1);
+ }
+ );
+ for(int i=0; i arr = new ArrayList<>();
+ arr.add(i);
+ arr.add(nums2[i]);
+ queue.add(arr);
+ }
+
+ Arrays.sort(nums1);
+
+ int left = 0, right = nums1.length-1;
+
+
+ while(left<=right) {
+ // 获取nums2的最大值
+ ArrayList arr = queue.poll();
+ assert arr != null;
+ int index = arr.get(0);
+ int value = arr.get(1);
+
+ if(nums1[right]>value) {
+ res[index] = nums1[right];
+ right--;
+ }else{
+ res[index] = nums1[left];
+ left++;
+ }
+ }
+
+ return res;
+ }
+}
diff --git a/algorithm/src/main/java/array/other/ContainerWithMostWater.java b/algorithm/src/main/java/array/other/ContainerWithMostWater.java
new file mode 100644
index 0000000..cf0b806
--- /dev/null
+++ b/algorithm/src/main/java/array/other/ContainerWithMostWater.java
@@ -0,0 +1,33 @@
+package array.other;
+
+/**
+ * 11 盛最多水的容器
+ */
+
+public class ContainerWithMostWater {
+
+ int containerWithMOstWater(int[] nums) {
+ int res = 0;
+ if(nums.length<2) {
+ return res;
+ }
+
+ int left=0, right=nums.length-1;
+ while (left> intervalListIntersections(int[][] nums1, int[][] nums2){
+ ArrayList> res = new ArrayList<>();
+ int left=0, right=0;
+ while (left arr = new ArrayList<>();
+ arr.add(leftBound);
+ arr.add(rightBound);
+ res.add(arr);
+ }
+ if(nums1[left][1]<= nums2[right][1]) {
+ left++;
+ } else if(nums1[left][1]> nums2[right][1]) {
+ right++;
+ }
+ }
+
+ return res;
+
+ }
+}
diff --git a/algorithm/src/main/java/array/other/MaxRepeatSubString.java b/algorithm/src/main/java/array/other/MaxRepeatSubString.java
new file mode 100644
index 0000000..7ab144f
--- /dev/null
+++ b/algorithm/src/main/java/array/other/MaxRepeatSubString.java
@@ -0,0 +1,33 @@
+package array.other;
+
+/**
+ * 1668 最大重复子字符串
+ */
+
+public class MaxRepeatSubString {
+ public int maxRepeating(String sequence, String word) {
+ int res = 0;
+ int pos=0, p1=0, p2=0;
+ while(pos=0) {
+ if(nums[i][j]==target) {
+ res = true;
+ break;
+ } else if(nums[i][j]>target) {
+ j--;
+ } else {
+ i++;
+ }
+
+ }
+ return res;
+
+ }
+}
diff --git a/algorithm/src/main/java/array/other/SquaresSortedArray.java b/algorithm/src/main/java/array/other/SquaresSortedArray.java
new file mode 100644
index 0000000..be52187
--- /dev/null
+++ b/algorithm/src/main/java/array/other/SquaresSortedArray.java
@@ -0,0 +1,27 @@
+package array.other;
+
+/**
+ * 977 有序数组的平方
+ */
+
+public class SquaresSortedArray {
+
+ int[] squaresSortedArray(int[] nums) {
+ int[] res = new int[nums.length];
+ int left=0, right=nums.length-1, index=nums.length-1;
+
+ while (left<=right){
+ if(Math.abs(nums[left])>Math.abs(nums[right])) {
+ res[index] = nums[left]*nums[left];
+ index--;
+ left++;
+ }else{
+ res[index] = nums[right]*nums[right];
+ index--;
+ right--;
+ }
+ }
+
+ return res;
+ }
+}
diff --git a/algorithm/src/main/java/array/other/TrappingRainWater.java b/algorithm/src/main/java/array/other/TrappingRainWater.java
new file mode 100644
index 0000000..ed02766
--- /dev/null
+++ b/algorithm/src/main/java/array/other/TrappingRainWater.java
@@ -0,0 +1,45 @@
+package array.other;
+
+import java.util.PriorityQueue;
+import java.util.Stack;
+
+/**
+ * 42 接雨水
+ */
+
+public class TrappingRainWater {
+
+ int trappingRainWater(int[] nums) {
+ int res = 0;
+ if(nums.length<2) {
+ return res;
+ }
+
+ int[] leftHeight = new int[nums.length];
+ int[] rightHeight = new int[nums.length];
+ for(int i=0;i=0;i--) {
+ if(i==nums.length-1) {
+ rightHeight[i] = nums[i];
+ } else {
+ rightHeight[i] = Math.max(nums[i], rightHeight[i+1]);
+ }
+ }
+
+ for(int i=0; i findAnagrams(String s, String p) {
+ HashMap map = new HashMap<>();
+ HashMap need = new HashMap<>();
+ int count=0;
+
+ // 对need进行初始化
+ for(int i=0;i res = new ArrayList<>();
+ int left = 0, right=0;
+ while(right=p.length()) {
+
+ // 进行窗口数据更新
+ if(count==p.length()) {
+ res.add(left);
+ }
+ char t = s.charAt(left);
+ if(map.get(t).equals(need.getOrDefault(t, 0))) {
+ count--;
+ }
+ map.replace(t, map.get(t)-1);
+ left++;
+ }
+
+ }
+
+ return res;
+ }
+
+}
diff --git a/algorithm/src/main/java/array/slideWindow/LengthOfLongestSubstring.java b/algorithm/src/main/java/array/slideWindow/LengthOfLongestSubstring.java
new file mode 100644
index 0000000..97a3401
--- /dev/null
+++ b/algorithm/src/main/java/array/slideWindow/LengthOfLongestSubstring.java
@@ -0,0 +1,30 @@
+package array.slideWindow;
+
+import java.util.HashMap;
+
+
+public class LengthOfLongestSubstring {
+
+ public int lengthOfLongestSubstring(String s) {
+ HashMap map = new HashMap();
+
+ int res=0;
+ int left=0, right=0;
+ while(right1) {
+ char temp = s.charAt(left);
+ map.replace(temp,map.get(temp)-1);
+ left++;
+ }
+ res = Math.max(res, right-left);
+ }
+
+ return res;
+
+ }
+}
diff --git a/algorithm/src/main/java/array/slideWindow/MinWindowSubstring.java b/algorithm/src/main/java/array/slideWindow/MinWindowSubstring.java
new file mode 100644
index 0000000..0b8be00
--- /dev/null
+++ b/algorithm/src/main/java/array/slideWindow/MinWindowSubstring.java
@@ -0,0 +1,57 @@
+package array.slideWindow;
+
+/**
+ * 76. 最⼩覆盖⼦串
+ */
+
+import java.util.HashMap;
+
+public class MinWindowSubstring {
+
+ public String minWindowSubstring(String s, String t) {
+ HashMap map = new HashMap<>();
+ HashMap need = new HashMap<>();
+
+ // 对参数进行处理
+ for(int i=0; i right-left) {
+ tleft = left;
+ tright = right;
+ }
+
+ char tt = s.charAt(left);
+ left++;
+ if(map.get(tt).equals(need.getOrDefault(tt,0))) {
+ count--;
+ }
+ map.replace(tt, map.get(tt)-1);
+ }
+ }
+
+ if(tleft<0) {
+ return "";
+ }else {
+ return s.substring(tleft, tright);
+ }
+ }
+}
diff --git a/algorithm/src/main/java/array/slideWindow/MinimumWindow.java b/algorithm/src/main/java/array/slideWindow/MinimumWindow.java
new file mode 100644
index 0000000..4863801
--- /dev/null
+++ b/algorithm/src/main/java/array/slideWindow/MinimumWindow.java
@@ -0,0 +1,60 @@
+package array.slideWindow;
+
+import java.util.LinkedList;
+
+// 这是对 [239. 滑动窗⼝最⼤值] 的改编,求最小值
+
+public class MinimumWindow {
+
+ // 使用单调队列求解,时间复杂度为O(N)
+ public int[] minimumWindow(int[] nums, int k) {
+ if (k < 1 || nums.length < k) {
+ return new int[]{};
+ }
+
+ MonotonicMinQueue window = new MonotonicMinQueue();
+ int[] res = new int[nums.length+1-k];
+
+ for(int i=0;i minq = new LinkedList();
+
+ public void push(int n) {
+ // 将大于 n 的元素全部删除(等于时保留)
+ while(!minq.isEmpty() && minq.getLast()>n) {
+ minq.pollLast();
+ }
+ // 然后将 n 加入尾部
+ minq.addLast(n);
+ }
+
+ public int min() {
+ return minq.getFirst();
+ }
+
+ // 若元素大于 队列头部元素,那么会在添加的时候自动删除
+ // 所以我们只需要判断是否为第一个元素,是的话才需要手动删除
+ public void pop(int n) {
+ if(n==minq.getFirst()) {
+ minq.pollFirst();
+ }
+ }
+}
diff --git a/algorithm/src/main/java/array/slideWindow/Permutation.java b/algorithm/src/main/java/array/slideWindow/Permutation.java
new file mode 100644
index 0000000..fc8a713
--- /dev/null
+++ b/algorithm/src/main/java/array/slideWindow/Permutation.java
@@ -0,0 +1,50 @@
+package array.slideWindow;
+
+import java.util.HashMap;
+
+/**
+ * 567. 字符串的排列
+ */
+
+public class Permutation {
+
+ public boolean permutation(String s1, String s2) {
+ HashMap map = new HashMap<>();
+ HashMap need = new HashMap<>();
+
+ int left=0, right=0;
+ int count=0;
+
+ // 参数初始化
+ for(int i=0; i=s1.length()) {
+ if(right-left==count) {
+ return true;
+ }
+
+ char t = s2.charAt(left);
+ if(map.get(t).equals(need.getOrDefault(t, 0))) {
+ count --;
+ }
+ map.replace(t, map.get(t)-1);
+ left++;
+
+ }
+ }
+ return false;
+
+ }
+}
diff --git a/algorithm/src/main/java/array/slideWindow/SlidingWindowMaximum.java b/algorithm/src/main/java/array/slideWindow/SlidingWindowMaximum.java
new file mode 100644
index 0000000..614e6e3
--- /dev/null
+++ b/algorithm/src/main/java/array/slideWindow/SlidingWindowMaximum.java
@@ -0,0 +1,84 @@
+package array.slideWindow;
+
+import java.util.*;
+
+/**
+ * 239. 滑动窗⼝最⼤值
+ */
+
+public class SlidingWindowMaximum {
+
+ // 两个循环,时间复杂度为O(kN)
+ public int[] maximumWindow(int[] nums, int k) {
+ // 参数处理
+ if(k<1 || nums.length maxq = new LinkedList();
+
+ public void push(int n) {
+ // 将小于 n 的元素全部删除(等于时保留)
+ while(!maxq.isEmpty() && maxq.getLast()> combinationSum(int[] candidates, int target) {
+ ArrayList> res = new ArrayList<>();
+
+ // 初始化值为false
+// boolean[] visited = new boolean[candidates.length];
+ ArrayList temp = new ArrayList<>();
+
+ backtrack(0, candidates, target, temp, res);
+
+ return res;
+ }
+
+ void backtrack(int start, int[] candidates, int target, ArrayList temp, ArrayList> res) {
+ if(target == 0) {
+ res.add(new ArrayList<>(temp));
+ return;
+ } else if(target < 0) {
+ return;
+ }
+
+ //从当前的位置往后遍历,可以排除例如[2,2,3]和[2,3,2]的情况,最终得到[2,2,3]
+ for(int i=start; i> combinations(int n, int k) {
+ ArrayList> res = new ArrayList<>();
+ ArrayList temp = new ArrayList<>();
+ boolean[] visited = new boolean[n];
+ int[] nums = new int[n];
+ for(int i=0;i temp, ArrayList> res) {
+ if(k==temp.size()) {
+ res.add(new ArrayList<>(temp));
+ }
+
+ for(int i=start;i generateParentheses(int n) {
+ ArrayList res = new ArrayList<>();
+ backtrack(n, n, new StringBuilder(), res);
+ return res;
+ }
+
+ void backtrack(int left, int right, StringBuilder s, ArrayListres) {
+ // 左括号数量小于右括号,表明括号不合法
+ if(left > right) {
+ return;
+ }
+ // 数量小于0,表示不合法
+ if(left < 0 || right < 0) {
+ return;
+ }
+ // 当所有的括号都恰好用完,表明合法
+ if(left==0 && right==0) {
+ res.add(new String(s));
+ return;
+ }
+
+ // 添加左括号
+ s.append('(');
+ backtrack(left-1, right, s, res);
+ // 撤销添加
+ s.deleteCharAt(s.length()-1);
+
+ // 添加右括号
+ s.append(')');
+ backtrack(left, right-1, s, res);
+ // 撤销添加
+ s.deleteCharAt(s.length()-1);
+
+
+
+ }
+
+
+}
diff --git a/algorithm/src/main/java/backTrack/MaximumDepthBinaryTree.java b/algorithm/src/main/java/backTrack/MaximumDepthBinaryTree.java
new file mode 100644
index 0000000..236f36c
--- /dev/null
+++ b/algorithm/src/main/java/backTrack/MaximumDepthBinaryTree.java
@@ -0,0 +1,22 @@
+package backTrack;
+
+/**
+ * 104 二叉树最大深度
+ */
+
+import java.util.ArrayList;
+
+public class MaximumDepthBinaryTree {
+
+ int maximumDepth(ArrayList nums) {
+ int res = 0;
+ backtrack();
+
+ return res;
+
+ }
+
+ public void backtrack() {
+
+ }
+}
diff --git a/algorithm/src/main/java/backTrack/NQueues.java b/algorithm/src/main/java/backTrack/NQueues.java
new file mode 100644
index 0000000..9087446
--- /dev/null
+++ b/algorithm/src/main/java/backTrack/NQueues.java
@@ -0,0 +1,77 @@
+package backTrack;
+
+/**
+ * 52 N-Queues
+ */
+
+import java.util.ArrayList;
+
+public class NQueues {
+
+ public ArrayList> nQueues(int n) {
+ ArrayList> res = new ArrayList<>();
+ char[][] board = new char[n][n];
+ for(int i=0; i> res) {
+ if(row==board.length) {
+ ArrayList temp = new ArrayList<>();
+ for(int i=0; i=0 && j=0 && j>=0; i--,j--) {
+ if(board[i][j]=='Q') {
+ return false;
+ }
+ }
+
+ return true;
+ }
+}
diff --git a/algorithm/src/main/java/backTrack/PartitionKEqualSumSubsets.java b/algorithm/src/main/java/backTrack/PartitionKEqualSumSubsets.java
new file mode 100644
index 0000000..25073d0
--- /dev/null
+++ b/algorithm/src/main/java/backTrack/PartitionKEqualSumSubsets.java
@@ -0,0 +1,53 @@
+package backTrack;
+
+/**
+ * 698 划分为k个相等的子集
+ */
+
+public class PartitionKEqualSumSubsets {
+
+ public boolean partitionKEqualSumSubsets(int[] nums, int k) {
+ int sum = 0;
+ for(int i=0; i 0) {
+ return false;
+ }
+
+ int target = sum /k;
+ boolean[] visited = new boolean[nums.length];
+
+ boolean res = backtrack(k, nums, 0, visited, target);
+
+ return res;
+ }
+
+ boolean backtrack(int k, int[] nums, int bucket, boolean[] visited, int target) {
+ if(k==0) {
+ return true;
+ }
+
+ //桶装满了,那么装下一个桶
+ if(bucket==target) {
+ return backtrack(k-1, nums, 0, visited, target);
+ }
+
+ for(int i=0; i> permutations(int[] nums) {
+ ArrayList> res = new ArrayList<>();
+ ArrayList temp = new ArrayList<>();
+ boolean[] visited = new boolean[nums.length];
+ backtrack(nums, visited, temp, res);
+ return res;
+ }
+
+ void backtrack(int[] nums, boolean[] visited, ArrayList temp, ArrayList> res) {
+ if(nums.length==temp.size()) {
+ res.add(new ArrayList<>(temp));
+ return;
+ }
+
+ for(int i=0; i> subsets(int[] nums) {
+ ArrayList> res = new ArrayList<>();
+ ArrayList temp = new ArrayList<>();
+ backtrack(0, nums, temp, res);
+
+ return res;
+ }
+
+ void backtrack(int start,int[] nums, ArrayList temp, ArrayList> res) {
+ res.add(new ArrayList<>(temp));
+
+ for(int i=start; i large = new PriorityQueue<>((a,b) -> {
+ return a-b;
+ });
+ int capacity;
+
+
+ public KthLargestData(int k, int[] nums) {
+ capacity = k;
+ for(int num : nums) {
+ this.add(num);
+ }
+ }
+
+ public int add(int val) {
+ large.add(val);
+ if(large.size()>capacity) {
+ large.poll();
+ }
+ return large.peek();
+ }
+}
diff --git a/algorithm/src/main/java/binaryHeap/KthLargestElement.java b/algorithm/src/main/java/binaryHeap/KthLargestElement.java
new file mode 100644
index 0000000..fd14eb2
--- /dev/null
+++ b/algorithm/src/main/java/binaryHeap/KthLargestElement.java
@@ -0,0 +1,44 @@
+package binaryHeap;
+
+import java.util.Comparator;
+import java.util.PriorityQueue;
+
+/**
+ * 215. 数组中的第K个最⼤元素
+ */
+
+public class KthLargestElement {
+
+ public int kthLargest(int[] nums, int k) {
+ int res = 0;
+
+// Comparator comparator = new Comparator() {
+// @Override
+// public int compare(Integer o1, Integer o2) {
+// return o1-o2; // 从小到大排序
+// }
+// };
+
+// PriorityQueue queue = new PriorityQueue<>(comparator);
+ // 等价于
+
+ // 从小到大排序
+ PriorityQueue queue = new PriorityQueue(
+ (o1, o2) -> {
+ return o1-o2;
+ }
+ );
+ for(int i=0;ik) {
+ queue.poll(); // 移除最上面的元素
+ }
+ }
+ res = queue.peek();
+
+
+ return res;
+ }
+
+
+}
diff --git a/algorithm/src/main/java/binaryHeap/MaxFrequency.java b/algorithm/src/main/java/binaryHeap/MaxFrequency.java
new file mode 100644
index 0000000..c3c8ecd
--- /dev/null
+++ b/algorithm/src/main/java/binaryHeap/MaxFrequency.java
@@ -0,0 +1,18 @@
+package binaryHeap;
+
+/**
+ * 895. 最⼤频率栈
+ * ======================== 未完成
+ */
+
+public class MaxFrequency {
+
+
+
+ public void push(int val) {
+ }
+
+ public int pop() {
+ return -1;
+ }
+}
diff --git a/algorithm/src/main/java/binaryHeap/MedianData.java b/algorithm/src/main/java/binaryHeap/MedianData.java
new file mode 100644
index 0000000..6ccd7bb
--- /dev/null
+++ b/algorithm/src/main/java/binaryHeap/MedianData.java
@@ -0,0 +1,49 @@
+package binaryHeap;
+
+/**
+ * 295 数据流中的中位数
+ */
+
+import java.util.PriorityQueue;
+
+public class MedianData {
+ // large的最小值 >= small的最大值
+ // 从小到大排序
+ private PriorityQueue large = new PriorityQueue<>((a, b) -> {
+ return a-b;
+ });
+ // 从大到小排序
+ private PriorityQueue small = new PriorityQueue<>((a, b) -> {
+ return b-a;
+ });
+
+ public void addNum(int num) {
+ // 先往small队列中存入值,然后将最大值传递给large队列
+ if(small.size()>large.size()) {
+ small.add(num);
+ Integer temp = small.poll();
+ large.add(temp);
+ } else {
+ large.add(num);
+ small.add(large.poll());
+ }
+
+ }
+
+ public double findMedian() {
+ // 判断数据小于2个的情况
+ if(small.isEmpty() && large.isEmpty()) {
+ return 0;
+ } else if(large.isEmpty()) {
+ return small.peek();
+ }
+ // 若small队列长度>大于large队列长度,那么small顶部就是中位数
+ if(small.size()==large.size()) {
+ return (small.peek()+large.peek())/2.0;
+ } else if(small.size() stack = new Stack<>();
+ // 从小到大排序
+ private Stack min = new Stack<>();
+
+ public MinStack() {
+
+ }
+
+ public void push(int val) {
+ stack.push(val);
+ if(min.isEmpty()) {
+ min.add(val);
+ } else if(min.peek()>val) {
+ min.add(val);
+ } else {
+ min.add(min.peek());
+ }
+ }
+
+ public void pop() {
+ stack.pop();
+ min.pop();
+ }
+
+ public int top() {
+ return stack.peek();
+ }
+
+ public int getMin() {
+ return min.peek();
+ }
+
+
+
+}
diff --git a/algorithm/src/main/java/binaryHeap/SeatReserve.java b/algorithm/src/main/java/binaryHeap/SeatReserve.java
new file mode 100644
index 0000000..4bc469b
--- /dev/null
+++ b/algorithm/src/main/java/binaryHeap/SeatReserve.java
@@ -0,0 +1,38 @@
+package binaryHeap;
+
+/**
+ * 1845. 座位预约管理系统
+ */
+
+import java.util.PriorityQueue;
+
+public class SeatReserve {
+
+ // 从小到大排序,表示可预订座位编号
+ private PriorityQueue queue = new PriorityQueue((a, b) -> {
+ return a-b;
+ });
+ private int num;
+
+ public SeatReserve(int n) {
+ num = n;
+ for(int i=0;i0) {
+ return queue.poll();
+ } else {
+ return -1;
+ }
+ }
+
+ public void unreserve(int seatNumber) {
+ if(queue.size() queue1 = new PriorityQueue(
+ (Task o1, Task o2) -> {
+ if(o1.start==o2.start) {
+ if(o1.cost==o2.cost) {
+ return o1.index-o2.index;
+ }else {
+ return o1.cost-o2.cost;
+ }
+ }else {
+ return o1.start - o2.start;
+ }
+ });
+ // 对任务执行时长、索引编号从小到大排序
+ PriorityQueue queue2 = new PriorityQueue<>(
+ (o1, o2) -> {
+ if(o1.cost==o2.cost) {
+ return o1.index-o2.index;
+ }else {
+ return o1.cost-o2.cost;
+ }
+ }
+ );
+
+ // 实例化Task
+ for(int i=0; i> binaryTreeLevelOrderTraversal(TreeNode root) {
+
+ ArrayList> res = new ArrayList<>();
+ traverse(root, 0, res);
+ return res;
+ }
+
+ void traverse(TreeNode root, int level, ArrayList> res) {
+ if(root==null) {
+ return;
+ }
+ if(level>=res.size()) {
+ res.add(new ArrayList<>());
+ }
+ res.get(level).add(root.val);
+
+ traverse(root.left, level+1, res);
+ traverse(root.right, level+1, res);
+ }
+}
diff --git a/algorithm/src/main/java/binaryTree/BinaryTreePostorderTraversal.java b/algorithm/src/main/java/binaryTree/BinaryTreePostorderTraversal.java
new file mode 100644
index 0000000..db81d07
--- /dev/null
+++ b/algorithm/src/main/java/binaryTree/BinaryTreePostorderTraversal.java
@@ -0,0 +1,28 @@
+package binaryTree;
+
+import java.util.LinkedList;
+
+/**
+ * 145 二叉树的后续遍历
+ */
+
+public class BinaryTreePostorderTraversal {
+ LinkedList binaryTreePostorderTraversal(TreeNode root) {
+ LinkedList res = new LinkedList<>();
+
+ traverse(root, res);
+
+ return res;
+ }
+
+ void traverse(TreeNode root, LinkedList res) {
+ if(root==null) {
+ return;
+ }
+ traverse(root.left, res);
+ traverse(root.right, res);
+ res.addFirst(root.val);
+ }
+
+
+}
diff --git a/algorithm/src/main/java/binaryTree/BinaryTreeZigzagLevelOrderTraversal.java b/algorithm/src/main/java/binaryTree/BinaryTreeZigzagLevelOrderTraversal.java
new file mode 100644
index 0000000..aa28cd8
--- /dev/null
+++ b/algorithm/src/main/java/binaryTree/BinaryTreeZigzagLevelOrderTraversal.java
@@ -0,0 +1,39 @@
+package binaryTree;
+
+/**
+ * [103. 二叉树的锯齿形层序遍历]
+ */
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.Queue;
+
+public class BinaryTreeZigzagLevelOrderTraversal {
+
+ public LinkedList> zigzagOrder(TreeNode root) {
+ LinkedList> res = new LinkedList<>();
+
+ traverse(root, 0, res);
+ return res;
+ }
+
+ void traverse(TreeNode root, int level, LinkedList> res) {
+ if(root==null) {
+ return;
+ }
+ if(level>=res.size()) {
+// System.out.println(root.val);
+ res.add(new LinkedList<>());
+ }
+
+ // 偶数层从左到右,奇数层从右到左
+ if(level%2==1) {
+ res.get(level).addFirst(root.val);
+ }else {
+ res.get(level).add(root.val);
+ }
+
+ traverse(root.left, level+1, res);
+ traverse(root.right, level+1, res);
+ }
+}
diff --git a/algorithm/src/main/java/binaryTree/DiameterBinaryTree.java b/algorithm/src/main/java/binaryTree/DiameterBinaryTree.java
new file mode 100644
index 0000000..77359f3
--- /dev/null
+++ b/algorithm/src/main/java/binaryTree/DiameterBinaryTree.java
@@ -0,0 +1,24 @@
+package binaryTree;
+
+/**
+ * 543 二叉树的直径
+ */
+
+public class DiameterBinaryTree {
+
+ public int diameterBinaryTree(TreeNode root) {
+ int left = traverse(root.left);
+ int right = traverse(root.right);
+ return left+right;
+ }
+
+ int traverse(TreeNode root) {
+ if(root==null) {
+ return 0;
+ }
+
+ int left = traverse(root.left);
+ int right = traverse(root.right);
+ return 1+Math.max(left, right);
+ }
+}
diff --git a/algorithm/src/main/java/binaryTree/FlattenBinaryTreeToLinkedList.java b/algorithm/src/main/java/binaryTree/FlattenBinaryTreeToLinkedList.java
new file mode 100644
index 0000000..7c18871
--- /dev/null
+++ b/algorithm/src/main/java/binaryTree/FlattenBinaryTreeToLinkedList.java
@@ -0,0 +1,37 @@
+package binaryTree;
+
+import java.util.LinkedList;
+
+/**
+ * 114 二叉树展开为链表
+ */
+
+public class FlattenBinaryTreeToLinkedList {
+
+ LinkedList flattenBinaryTreeToLinkedList(TreeNode root) {
+ LinkedList res = new LinkedList<>();
+ traverse(root, res);
+ // 重新排列
+ for(int i=0; i res) {
+ if(root==null) {
+ return;
+ }
+// if(res.size()>0) {
+// TreeNode last = res.getLast();
+// last.left = null;
+// last.right = root;
+// }
+ res.add(root);
+ traverse(root.left, res);
+ traverse(root.right, res);
+
+ }
+}
diff --git a/algorithm/src/main/java/binaryTree/InorderTraversal.java b/algorithm/src/main/java/binaryTree/InorderTraversal.java
new file mode 100644
index 0000000..0e23281
--- /dev/null
+++ b/algorithm/src/main/java/binaryTree/InorderTraversal.java
@@ -0,0 +1,46 @@
+package binaryTree;
+
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * 94. ⼆叉树的中序遍历
+ */
+
+public class InorderTraversal {
+ /* 回溯算法思路*/
+ LinkedList res = new LinkedList<>();
+
+
+ // 中序遍历结果
+ public List inorderTraversal(TreeNode root) {
+ LinkedList res = new LinkedList<>();
+ if(root == null) {
+ return res;
+ }
+
+ res.addAll(inorderTraversal(root.left));
+ res.add(root.val);
+ res.addAll(inorderTraversal(root.right));
+ return res;
+ }
+
+ // 返回前序遍历结果
+ public List preorderTraversal(TreeNode root) {
+ traverse(root);
+ return res;
+ }
+
+ // 二叉树遍历函数
+ void traverse(TreeNode root) {
+ if(root == null) {
+ return;
+ }
+
+ traverse(root.left);
+ //中序遍历
+ res.add(root.val);
+ traverse(root.right);
+ }
+
+}
diff --git a/algorithm/src/main/java/binaryTree/InvertBinaryTree.java b/algorithm/src/main/java/binaryTree/InvertBinaryTree.java
new file mode 100644
index 0000000..b95c22e
--- /dev/null
+++ b/algorithm/src/main/java/binaryTree/InvertBinaryTree.java
@@ -0,0 +1,28 @@
+package binaryTree;
+
+/**
+ * 226 翻转二叉树
+ */
+
+public class InvertBinaryTree {
+
+ public void invertBinaryTree(TreeNode root) {
+ traverse(root);
+ }
+
+ void traverse(TreeNode root) {
+ if(root==null) {
+ return;
+ }
+
+
+ TreeNode temp = null;
+ temp = root.left;
+ root.left = root.right;
+ root.right = temp;
+
+ traverse(root.left);
+ traverse(root.right);
+
+ }
+}
diff --git a/algorithm/src/main/java/binaryTree/LevelOrderTraversal.java b/algorithm/src/main/java/binaryTree/LevelOrderTraversal.java
new file mode 100644
index 0000000..5bee268
--- /dev/null
+++ b/algorithm/src/main/java/binaryTree/LevelOrderTraversal.java
@@ -0,0 +1,45 @@
+package binaryTree;
+
+import java.util.LinkedList;
+import java.util.Queue;
+
+/**
+ * 102. ⼆叉树的层序遍历
+ */
+
+public class LevelOrderTraversal {
+
+
+
+ LinkedList> levelOrderTraversal(TreeNode root) {
+ LinkedList> res = new LinkedList<>();
+
+ if(root == null) {
+ return res;
+ }
+
+ Queue q = new LinkedList<>();
+ q.offer(root); // 添加二叉树
+ while(!q.isEmpty()) {
+ int sz = q.size();
+ // 记录下这一层节点值
+ LinkedList temp = new LinkedList<>();
+ // for循环控制每一层从左向右遍历
+ for(int i=0;i list = new LinkedList<>();
+ for(String t : str.split(",")) {
+ list.add(t);
+ }
+
+ TreeNode res = deserializeTraverse(list);
+
+ return res;
+ }
+
+ TreeNode deserializeTraverse(LinkedList list) {
+ // 采用后序遍历
+ if(list.isEmpty()) {
+ return null;
+ }
+
+ String first = list.removeFirst();
+ if(first.equals("null")) {
+ return null;
+ }
+
+ // 前序创建节点
+ int val = Integer.parseInt(first);
+
+ TreeNode root = new TreeNode(val);
+
+ //后续关联节点
+ root.left = deserializeTraverse(list);
+ root.right = deserializeTraverse(list);
+ return root;
+
+
+ }
+}
diff --git a/algorithm/src/main/java/binaryTree/TreeNode.java b/algorithm/src/main/java/binaryTree/TreeNode.java
new file mode 100644
index 0000000..632244d
--- /dev/null
+++ b/algorithm/src/main/java/binaryTree/TreeNode.java
@@ -0,0 +1,82 @@
+package binaryTree;
+
+import java.util.LinkedList;
+import java.util.List;
+import java.util.PriorityQueue;
+
+public class TreeNode {
+ public int val;
+ public TreeNode left;
+ public TreeNode right;
+
+ static LinkedList res = new LinkedList<>();
+
+ public TreeNode() {}
+
+ public TreeNode(int val) {
+ this.val = val;
+ }
+
+ public TreeNode(int val, TreeNode left, TreeNode right) {
+ this.val = val;
+ this.left = left;
+ this.right = right;
+ }
+
+ public static LinkedList treeNodeToNum(TreeNode root) {
+ LinkedList list = new LinkedList<>();
+ preorderTraversal(root, list);
+ return list;
+ }
+
+ // 返回前序遍历结果
+ static void preorderTraversal(TreeNode root, LinkedList res) {
+ if(root==null) {
+ return;
+ }
+ res.add(root.val);
+ preorderTraversal(root.left, res);
+ preorderTraversal(root.right, res);
+ }
+
+ // 二叉树遍历函数
+ static void traverse(TreeNode root) {
+ if(root == null) {
+ return;
+ }
+
+ traverse(root.left);
+ //中序遍历
+ res.add(root.val);
+ traverse(root.right);
+ }
+
+ public static TreeNode numsToTreeNode (int[] nums) {
+ if(nums.length==0) {
+ return null;
+ }
+ LinkedList queue = new LinkedList<>();
+ TreeNode root = new TreeNode(nums[0]);
+ queue.add(root);
+
+ for(int index=1; index< nums.length;) {
+ int size = queue.size();
+ for(int i=0; i> zigzagOrder(TreeNode root) {
+ LinkedList> res = new LinkedList<>();
+ if (root == null) {
+ return res;
+ }
+
+ Queue q = new LinkedList<>();
+ boolean flag = false;
+ q.offer(root); // 添加
+
+ while (!q.isEmpty()) {
+ int sz = q.size();
+ LinkedList temp = new LinkedList<>();
+ for (int i = 0; i < sz; i++) {
+ TreeNode curr = q.poll(); // 弹出
+ if (!flag) {
+ temp.addFirst(curr.val);
+ }else {
+ temp.addLast(curr.val);
+ }
+ if(curr.left!=null){
+ q.offer(curr.left);
+ }
+ if(curr.right!=null){
+ q.offer(curr.right);
+ }
+ }
+ flag = !flag;
+ res.add(temp);
+ }
+ return res;
+ }
+}
diff --git a/algorithm/src/main/java/competition/AverageValue.java b/algorithm/src/main/java/competition/AverageValue.java
new file mode 100644
index 0000000..b756dba
--- /dev/null
+++ b/algorithm/src/main/java/competition/AverageValue.java
@@ -0,0 +1,22 @@
+package competition;
+
+/**
+ * 2455 可被三整除的偶数的平均值
+ */
+
+public class AverageValue {
+ public int averageValue(int[] nums) {
+ int res = 0;
+ int count = 0;
+ for(int n: nums) {
+ if(n%6==0) {
+ res+=n;
+ count++;
+ }
+ }
+ if(count>0) {
+ res = res/count;
+ }
+ return res;
+ }
+}
diff --git a/algorithm/src/main/java/dataStructureDesign/InsertDeleteGetRandom.java b/algorithm/src/main/java/dataStructureDesign/InsertDeleteGetRandom.java
new file mode 100644
index 0000000..53b5cca
--- /dev/null
+++ b/algorithm/src/main/java/dataStructureDesign/InsertDeleteGetRandom.java
@@ -0,0 +1,39 @@
+package dataStructureDesign;
+
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Random;
+
+/**
+ * 380 O(1)时间插入、删除、获取随机元素
+ */
+
+public class InsertDeleteGetRandom {
+
+ ArrayList data = new ArrayList<>();
+
+ boolean insert(int val) {
+ if(data.contains(val)) {
+ return false;
+ }else {
+ data.add(val);
+ return true;
+ }
+ }
+
+ boolean remove(int val) {
+ if(data.contains(val)) {
+ // 若不转换成对象,那么默认按照索引删除
+ data.remove((Integer) val);
+ return true;
+ }else {
+ return false;
+ }
+ }
+
+ int getRandom() {
+ int index = new Random().nextInt()%data.size();
+ return data.get(index);
+ }
+}
diff --git a/algorithm/src/main/java/dataStructureDesign/LFUCache.java b/algorithm/src/main/java/dataStructureDesign/LFUCache.java
new file mode 100644
index 0000000..5641852
--- /dev/null
+++ b/algorithm/src/main/java/dataStructureDesign/LFUCache.java
@@ -0,0 +1,86 @@
+package dataStructureDesign;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.PriorityQueue;
+
+/**
+ * 460 LFU缓存
+ */
+
+class LFUNode {
+ int index;
+ int key;
+ int val;
+ int count;
+
+ public LFUNode(int index, int key, int val) {
+ this.index = index;
+ this.key = key;
+ this.val = val;
+ this.count = 0;
+ }
+
+ public void increase() {
+ count++;
+ }
+}
+
+public class LFUCache {
+ int capacity;
+ int index = 0;
+ HashMap map = new HashMap<>();
+
+ // 按照访问次数、存放时间从小到大排序、
+ PriorityQueue queue = new PriorityQueue<>(
+ (o1, o2) -> {
+ if(o1.count==o2.count) {
+ return o1.index - o2.index;
+ }else {
+ return o1.count - o2.count;
+ }
+ }
+ );
+
+
+ public LFUCache(int capacity) {
+ this.capacity = capacity;
+ }
+
+ int get(int key) {
+ if(map.containsKey(key)) {
+ LFUNode temp = map.get(key);
+ // 更新访问次数
+ temp.increase();
+ // 更新索引编号
+ temp.index = index;
+ index++;
+ return temp.val;
+ }
+ return -1;
+ }
+
+ void put(int key, int val) {
+ if(map.containsKey(key)) {
+ // 更新数据
+ LFUNode data = map.get(key);
+ data.val = val;
+ data.increase();
+ data.index = index;
+ index++;
+ } else {
+ // 判断是否超过缓存
+ if(map.size()>=capacity) {
+
+ LFUNode d = queue.poll();
+ d.count = 0;
+ map.remove(d.key);
+ }
+
+ LFUNode temp = new LFUNode(index, key, val);
+ map.put(key, temp);
+ queue.add(temp);
+ index++;
+ }
+ }
+}
diff --git a/algorithm/src/main/java/dataStructureDesign/LRUCache.java b/algorithm/src/main/java/dataStructureDesign/LRUCache.java
new file mode 100644
index 0000000..c3a498f
--- /dev/null
+++ b/algorithm/src/main/java/dataStructureDesign/LRUCache.java
@@ -0,0 +1,86 @@
+package dataStructureDesign;
+
+import linkedList.doublePointer.ListNode;
+import org.w3c.dom.NodeList;
+
+/**
+ * 146 LRU 缓存机制
+ */
+
+
+class Node {
+ int key;
+ int val;
+ Node next;
+ public Node(int key, int val) {
+ this.key = key;
+ this.val = val;
+ }
+}
+
+// 使用单链表来处理
+public class LRUCache {
+
+ private int capacity;
+ private int size = 0;
+ Node dummy = new Node(-1, -1);
+
+ public LRUCache(int capacity) {
+ this.capacity = capacity;
+ }
+
+ public int get(int key) {
+ Node pre = dummy;
+ Node cur = pre.next;
+ while (cur!=null) {
+ if(cur.key==key) {
+ moveCurrentNode(pre, cur);
+ return cur.val;
+ }
+ pre = pre.next;
+ cur = pre.next;
+ }
+ return -1;
+
+ }
+
+ public void put(int key, int value) {
+
+ Node pre =dummy;
+ Node cur = dummy.next;
+
+ // 先遍历,数据是否存在
+ while (cur!=null) {
+ if(cur.key==key) {
+ cur.val = value;
+ moveCurrentNode(pre, cur);
+ return;
+ }
+ cur = cur.next;
+ // 保留倒数第二个节点
+ if(cur!=null) {
+ pre = pre.next;
+ }
+ }
+
+ // 若数据不存在,那么添加数据
+ Node head = dummy.next;
+ dummy.next = new Node(key, value);
+ dummy.next.next = head;
+ // 节点数自增1
+ size++;
+ if(size>capacity) {
+ pre.next = null;
+ size = capacity;
+ }
+
+ }
+
+ void moveCurrentNode(Node pre, Node cur) {
+ pre.next = cur.next;
+ cur.next = dummy.next;
+ dummy.next = cur;
+ }
+
+
+}
diff --git a/algorithm/src/main/java/dataStructureDesign/LRUCache2.java b/algorithm/src/main/java/dataStructureDesign/LRUCache2.java
new file mode 100644
index 0000000..0c35cbe
--- /dev/null
+++ b/algorithm/src/main/java/dataStructureDesign/LRUCache2.java
@@ -0,0 +1,54 @@
+package dataStructureDesign;
+
+import java.util.LinkedHashMap;
+
+/**
+ * 146 LRU 缓存机制
+ */
+
+
+// 使用LinkedHashMap双链表来处理
+
+public class LRUCache2 {
+
+ private int capacity;
+ LinkedHashMap map = new LinkedHashMap<>();
+
+ public LRUCache2(int capacity) {
+ this.capacity = capacity;
+ }
+
+ public int get(int key) {
+ if(map.containsKey(key)) {
+ int value = map.get(key);
+ moveHead(key);
+ return value;
+ }
+ return -1;
+ }
+
+ public void put(int key, int value) {
+ if(map.containsKey(key)) {
+ map.replace(key, value);
+ } else {
+ map.put(key, value);
+ }
+
+ if(map.size()>capacity) {
+ int removeKey = map.keySet().iterator().next();
+ map.remove(removeKey);
+ }
+
+
+ }
+
+ void moveHead(int key) {
+ int value = map.get(key);
+ // 删除元素
+ map.remove(key);
+ // 添加到队尾
+ map.put(key, value);
+ }
+
+
+}
diff --git a/algorithm/src/main/java/dataStructureDesign/MaximumFrequencyStack.java b/algorithm/src/main/java/dataStructureDesign/MaximumFrequencyStack.java
new file mode 100644
index 0000000..200e28c
--- /dev/null
+++ b/algorithm/src/main/java/dataStructureDesign/MaximumFrequencyStack.java
@@ -0,0 +1,48 @@
+package dataStructureDesign;
+
+import java.util.HashMap;
+import java.util.PriorityQueue;
+import java.util.Stack;
+
+/**
+ * 895 最大频率栈
+ */
+
+
+public class MaximumFrequencyStack {
+
+ // 当前最大频率
+ int maxFre = 0;
+
+ // 数值与频率的映射表
+ HashMap valToFre = new HashMap<>();
+ // 频率与数值的映射表
+ HashMap> freToVal = new HashMap>();
+
+
+ public void push(int val) {
+ // 修改 VF 表:val 对应的 freq 加⼀
+ int fre = valToFre.getOrDefault(val, 0) + 1;
+ valToFre.put(val, fre);
+ // 修改 FV 表:在 freq 对应的列表加上 val
+ freToVal.putIfAbsent(fre, new Stack<>());
+ freToVal.get(fre).push(val);
+ // 更新 maxFreq
+ maxFre = Math.max(maxFre, fre);
+
+ }
+
+ public int pop() {
+ Stack vals = freToVal.get(maxFre);
+ int v = vals.pop();
+ valToFre.replace(v, maxFre-1);
+ if(vals.isEmpty()) {
+ maxFre--;
+ freToVal.remove(maxFre);
+ }
+ return v;
+ }
+
+}
+
+
diff --git a/algorithm/src/main/java/dataStructureDesign/MinStack.java b/algorithm/src/main/java/dataStructureDesign/MinStack.java
new file mode 100644
index 0000000..abd5fb0
--- /dev/null
+++ b/algorithm/src/main/java/dataStructureDesign/MinStack.java
@@ -0,0 +1,36 @@
+package dataStructureDesign;
+
+import java.util.Stack;
+
+/**
+ * 155 最小栈
+ */
+
+public class MinStack {
+
+ Stack stack1 = new Stack<>();
+ Stack stack2 = new Stack<>();
+
+ void push(int val) {
+ if(stack1.isEmpty()) {
+ stack2.push(val);
+ }else {
+ int minVal = Math.min(stack2.peek(), val);
+ stack2.push(minVal);
+ }
+ stack1.push(val);
+ }
+
+ void pop() {
+ stack1.pop();
+ stack2.pop();
+ }
+
+ int top() {
+ return stack1.peek();
+ }
+
+ int getMin() {
+ return stack2.peek();
+ }
+}
diff --git a/algorithm/src/main/java/differenceArray/CarPooling.java b/algorithm/src/main/java/differenceArray/CarPooling.java
new file mode 100644
index 0000000..c417772
--- /dev/null
+++ b/algorithm/src/main/java/differenceArray/CarPooling.java
@@ -0,0 +1,38 @@
+package differenceArray;
+
+/**
+ * 1094. 拼车
+ * 公交站台数量不多于1000个
+ */
+
+public class CarPooling {
+
+ public boolean carPooling(int[][] trips, int capacity) {
+ if(trips.length==0) {
+ return true;
+ }
+ boolean res = true;
+
+ // 初始化差分数组
+ int[] diff = new int[1001];
+
+ // 对差分数组进行操作
+ for(int i=0;icapacity) {
+ res = false;
+ break;
+ }
+ }
+ return res;
+ }
+}
diff --git a/algorithm/src/main/java/differenceArray/FlightBooking.java b/algorithm/src/main/java/differenceArray/FlightBooking.java
new file mode 100644
index 0000000..830e398
--- /dev/null
+++ b/algorithm/src/main/java/differenceArray/FlightBooking.java
@@ -0,0 +1,32 @@
+package differenceArray;
+
+/**
+ * 1109. 航班预订统计
+ */
+
+public class FlightBooking {
+
+ int[] flightBooking(int[][] bookings, int n) {
+
+ int[] diff = new int[n];
+
+ // 初始化差分数组
+ for(int i=0;i> res = new LinkedList<>();
+
+ public List> allPathResourceTarget(int[][] graph) {
+ LinkedList path = new LinkedList<>();
+ traverse(graph, 0, path);
+ return res;
+
+ }
+
+ // 图的遍历框架
+ private void traverse(int[][] graph, int s, LinkedList path) {
+
+ // 添加节点 s 到路径
+ path.addLast(s);
+
+ int n = graph.length;
+ if(s == n-1) {
+ // 到达终点
+ res.add(new LinkedList<>(path));
+ path.removeLast();
+ return;
+ }
+
+ // 递归每个相邻节点
+ for(int v: graph[s]) {
+ traverse(graph, v, path);
+ }
+
+ // 从路径移除节点 s
+ path.removeLast();
+ }
+
+}
diff --git a/algorithm/src/main/java/images/binary-tree-traversal.jpg b/algorithm/src/main/java/images/binary-tree-traversal.jpg
new file mode 100644
index 0000000..d5ec630
Binary files /dev/null and b/algorithm/src/main/java/images/binary-tree-traversal.jpg differ
diff --git a/algorithm/src/main/java/images/graph.jpg b/algorithm/src/main/java/images/graph.jpg
new file mode 100644
index 0000000..d9cabcd
Binary files /dev/null and b/algorithm/src/main/java/images/graph.jpg differ
diff --git a/algorithm/src/main/java/images/plugin4.png b/algorithm/src/main/java/images/plugin4.png
new file mode 100644
index 0000000..1687cda
Binary files /dev/null and b/algorithm/src/main/java/images/plugin4.png differ
diff --git "a/algorithm/src/main/java/images/\344\272\214\345\217\211\346\240\221plugin1.png" "b/algorithm/src/main/java/images/\344\272\214\345\217\211\346\240\221plugin1.png"
new file mode 100644
index 0000000..df98632
Binary files /dev/null and "b/algorithm/src/main/java/images/\344\272\214\345\217\211\346\240\221plugin1.png" differ
diff --git "a/algorithm/src/main/java/images/\344\272\214\345\217\211\346\240\221plugin2.png" "b/algorithm/src/main/java/images/\344\272\214\345\217\211\346\240\221plugin2.png"
new file mode 100644
index 0000000..0524928
Binary files /dev/null and "b/algorithm/src/main/java/images/\344\272\214\345\217\211\346\240\221plugin2.png" differ
diff --git "a/algorithm/src/main/java/images/\344\272\214\345\217\211\346\240\221\344\276\213\345\255\220.jpg" "b/algorithm/src/main/java/images/\344\272\214\345\217\211\346\240\221\344\276\213\345\255\220.jpg"
new file mode 100644
index 0000000..2e654bc
Binary files /dev/null and "b/algorithm/src/main/java/images/\344\272\214\345\217\211\346\240\221\344\276\213\345\255\220.jpg" differ
diff --git "a/algorithm/src/main/java/images/\344\272\214\345\217\211\346\240\221\346\241\210\344\276\2132.png" "b/algorithm/src/main/java/images/\344\272\214\345\217\211\346\240\221\346\241\210\344\276\2132.png"
new file mode 100644
index 0000000..d9bdafb
Binary files /dev/null and "b/algorithm/src/main/java/images/\344\272\214\345\217\211\346\240\221\346\241\210\344\276\2132.png" differ
diff --git "a/algorithm/src/main/java/images/\344\272\214\345\217\211\346\240\221\351\201\215\345\216\206.gif" "b/algorithm/src/main/java/images/\344\272\214\345\217\211\346\240\221\351\201\215\345\216\206.gif"
new file mode 100644
index 0000000..44169dd
Binary files /dev/null and "b/algorithm/src/main/java/images/\344\272\214\345\217\211\346\240\221\351\201\215\345\216\206.gif" differ
diff --git "a/algorithm/src/main/java/images/\344\272\214\345\217\211\346\240\221\351\201\215\345\216\2062.jpeg" "b/algorithm/src/main/java/images/\344\272\214\345\217\211\346\240\221\351\201\215\345\216\2062.jpeg"
new file mode 100644
index 0000000..5b05f85
Binary files /dev/null and "b/algorithm/src/main/java/images/\344\272\214\345\217\211\346\240\221\351\201\215\345\216\2062.jpeg" differ
diff --git "a/algorithm/src/main/java/images/\345\211\215\344\270\255\345\220\216\345\272\217\344\272\214\345\217\211\346\240\221.jpeg" "b/algorithm/src/main/java/images/\345\211\215\344\270\255\345\220\216\345\272\217\344\272\214\345\217\211\346\240\221.jpeg"
new file mode 100644
index 0000000..5b05f85
Binary files /dev/null and "b/algorithm/src/main/java/images/\345\211\215\344\270\255\345\220\216\345\272\217\344\272\214\345\217\211\346\240\221.jpeg" differ
diff --git "a/algorithm/src/main/java/images/\345\211\215\345\272\217\345\220\216\347\273\255\351\201\215\345\216\206.jpeg" "b/algorithm/src/main/java/images/\345\211\215\345\272\217\345\220\216\347\273\255\351\201\215\345\216\206.jpeg"
new file mode 100644
index 0000000..7d7685a
Binary files /dev/null and "b/algorithm/src/main/java/images/\345\211\215\345\272\217\345\220\216\347\273\255\351\201\215\345\216\206.jpeg" differ
diff --git "a/algorithm/src/main/java/images/\345\211\215\345\272\217\351\201\215\345\216\2062.jpeg" "b/algorithm/src/main/java/images/\345\211\215\345\272\217\351\201\215\345\216\2062.jpeg"
new file mode 100644
index 0000000..225bd37
Binary files /dev/null and "b/algorithm/src/main/java/images/\345\211\215\345\272\217\351\201\215\345\216\2062.jpeg" differ
diff --git "a/algorithm/src/main/java/images/\345\217\215\350\275\254\351\223\276\350\241\2502.jpg" "b/algorithm/src/main/java/images/\345\217\215\350\275\254\351\223\276\350\241\2502.jpg"
new file mode 100644
index 0000000..ea20174
Binary files /dev/null and "b/algorithm/src/main/java/images/\345\217\215\350\275\254\351\223\276\350\241\2502.jpg" differ
diff --git "a/algorithm/src/main/java/images/\345\233\276\350\256\272\350\241\250\347\244\272\346\226\271\346\263\225.jpeg" "b/algorithm/src/main/java/images/\345\233\276\350\256\272\350\241\250\347\244\272\346\226\271\346\263\225.jpeg"
new file mode 100644
index 0000000..99f954d
Binary files /dev/null and "b/algorithm/src/main/java/images/\345\233\276\350\256\272\350\241\250\347\244\272\346\226\271\346\263\225.jpeg" differ
diff --git "a/algorithm/src/main/java/images/\345\272\246.jpg" "b/algorithm/src/main/java/images/\345\272\246.jpg"
new file mode 100644
index 0000000..d9cabcd
Binary files /dev/null and "b/algorithm/src/main/java/images/\345\272\246.jpg" differ
diff --git "a/algorithm/src/main/java/images/\345\276\252\347\216\257\351\201\215\345\216\206.jpeg" "b/algorithm/src/main/java/images/\345\276\252\347\216\257\351\201\215\345\216\206.jpeg"
new file mode 100644
index 0000000..687364b
Binary files /dev/null and "b/algorithm/src/main/java/images/\345\276\252\347\216\257\351\201\215\345\216\206.jpeg" differ
diff --git "a/algorithm/src/main/java/linkedList/doublePointer/19 \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.md" "b/algorithm/src/main/java/linkedList/doublePointer/19 \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.md"
new file mode 100644
index 0000000..b82608b
--- /dev/null
+++ "b/algorithm/src/main/java/linkedList/doublePointer/19 \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.md"
@@ -0,0 +1,11 @@
+
+
+
+
+## 解题思路
+
+
+
+本题采用双指针来求解。其中`right-left=N+1`,这是本题的关键。
+
+当right到达末尾时,其值为null,那么需要删除的位置为`left+1`处,这时需要将left、left+2处连接起来。
\ No newline at end of file
diff --git "a/algorithm/src/main/java/linkedList/doublePointer/23 \345\220\210\345\271\266K\344\270\252\345\215\207\345\272\217\351\223\276\350\241\250.md" "b/algorithm/src/main/java/linkedList/doublePointer/23 \345\220\210\345\271\266K\344\270\252\345\215\207\345\272\217\351\223\276\350\241\250.md"
new file mode 100644
index 0000000..d61f7ab
--- /dev/null
+++ "b/algorithm/src/main/java/linkedList/doublePointer/23 \345\220\210\345\271\266K\344\270\252\345\215\207\345\272\217\351\223\276\350\241\250.md"
@@ -0,0 +1,22 @@
+
+
+
+
+## 解题思路
+
+
+
+如果按照常规方法,使用指针去指向各个链表,那么无疑是计算量会很大的,因为会重复遍历。
+
+
+
+这题的关键点在于如何求得K个链表当前节点的最小值。只要求得了当前最小值,将其取出,然后再添加node.next即可。
+
+求K个值的最小值,可以使用PriorityQueue来求值。可以设定容量为K,即
+
+```java
+// 从小到大排列。优先级队列,最小堆,堆的容量等于链表的个数(K)
+ PriorityQueue pq = new PriorityQueue<>(
+ lists.length,(a,b) -> (a.val-b.val));
+```
+
diff --git a/algorithm/src/main/java/linkedList/doublePointer/AddTwoNumbers.java b/algorithm/src/main/java/linkedList/doublePointer/AddTwoNumbers.java
new file mode 100644
index 0000000..5e594fe
--- /dev/null
+++ b/algorithm/src/main/java/linkedList/doublePointer/AddTwoNumbers.java
@@ -0,0 +1,45 @@
+package linkedList.doublePointer;
+
+/*
+2. 两数相加
+ */
+
+public class AddTwoNumbers {
+
+ public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
+ // 两个链表上的两个指针
+ ListNode p1 =l1 , p2=l2;
+
+ // 虚拟节点(构建新链表时的常用技巧)
+ ListNode dummy = new ListNode(-1);
+
+ // 负责构建新链表
+ ListNode p = dummy;
+
+ // 进位符号
+ int carry=0;
+
+ while(p1!=null || p2!=null || carry>0) {
+ int val = carry;
+ carry = 0;
+ if(p1!=null) {
+ val += p1.val;
+ p1 = p1.next;
+ }
+ if(p2!=null) {
+ val += p2.val;
+ p2 = p2.next;
+ }
+ if (val>9) {
+ val -= 10;
+ carry = 1;
+ }
+ p.next = new ListNode(val);
+ p = p.next;
+ }
+
+ return dummy.next;
+
+
+ }
+}
diff --git a/algorithm/src/main/java/linkedList/doublePointer/AddTwoNumbers2.java b/algorithm/src/main/java/linkedList/doublePointer/AddTwoNumbers2.java
new file mode 100644
index 0000000..05e1054
--- /dev/null
+++ b/algorithm/src/main/java/linkedList/doublePointer/AddTwoNumbers2.java
@@ -0,0 +1,89 @@
+package linkedList.doublePointer;
+
+/*
+2. 两数相加
+改编部分:采用顺序存储
+
+ */
+
+public class AddTwoNumbers2 {
+
+ public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
+ // 对初始数据进行处理,使其从个位数开始
+ ListNode pre, next, curr = l1;
+ if(l1.next!=null) {
+ pre = l1;
+ next = l1.next;
+ pre.next = null;
+ while (next != null) {
+ curr = next;
+ next = next.next;
+ curr.next = pre;
+ pre = curr;
+ }
+ l1 = curr;
+ }
+
+ if(l2.next!=null) {
+ pre = l2;
+ next = l2.next;
+ pre.next = null;
+ while (next != null) {
+ curr = next;
+ next = next.next;
+ curr.next = pre;
+ pre = curr;
+ }
+ l2 = curr;
+ }
+
+
+ // 两个链表上的两个指针
+ ListNode p1 =l1 , p2=l2;
+
+ // 虚拟节点(构建新链表时的常用技巧)
+ ListNode dummy = new ListNode(-1);
+
+ // 负责构建新链表
+ ListNode p = dummy;
+
+ // 进位符号
+ int carry=0;
+
+ while(p1!=null || p2!=null || carry>0) {
+ int val = carry;
+ carry = 0;
+ if(p1!=null) {
+ val += p1.val;
+ p1 = p1.next;
+ }
+ if(p2!=null) {
+ val += p2.val;
+ p2 = p2.next;
+ }
+ if (val>9) {
+ val -= 10;
+ carry = 1;
+ }
+ p.next = new ListNode(val);
+ p = p.next;
+ }
+
+ // 对结果值进行处理
+ ListNode res = dummy.next;
+ if(res.next!=null) {
+ pre = res;
+ next = res.next;
+ pre.next = null;
+ while(next!=null) {
+ curr = next;
+ next = next.next;
+ curr.next = pre;
+ pre = curr;
+ }
+ }
+ return curr;
+
+
+ }
+}
diff --git a/algorithm/src/main/java/linkedList/doublePointer/DeleteNthNode.java b/algorithm/src/main/java/linkedList/doublePointer/DeleteNthNode.java
new file mode 100644
index 0000000..db8f914
--- /dev/null
+++ b/algorithm/src/main/java/linkedList/doublePointer/DeleteNthNode.java
@@ -0,0 +1,32 @@
+package linkedList.doublePointer;
+
+/**
+ * 19. 删除链表的倒数第 N 个结点 �
+ */
+
+public class DeleteNthNode {
+
+ public ListNode deleteNthNode(ListNode list, int n) {
+ ListNode slow = list, fast = list;
+
+ // 快指针先走 n 步
+ for(int i=0;i<=n;i++) {
+ if(fast==null) {
+ return list;
+ }
+ fast = fast.next;
+ }
+
+ // 快慢指针同时走,直到快指针到结尾处
+ while(fast!=null) {
+ fast = fast.next;
+ slow = slow.next;
+ }
+
+ if(slow.next!=null) {
+ slow.next = slow.next.next;
+ }
+
+ return list;
+ }
+}
diff --git a/algorithm/src/main/java/linkedList/doublePointer/LinkedListCycle.java b/algorithm/src/main/java/linkedList/doublePointer/LinkedListCycle.java
new file mode 100644
index 0000000..8be935f
--- /dev/null
+++ b/algorithm/src/main/java/linkedList/doublePointer/LinkedListCycle.java
@@ -0,0 +1,29 @@
+package linkedList.doublePointer;
+
+/**
+ * 141. 环形链表
+ * // 使用快慢指针解题
+ */
+
+public class LinkedListCycle {
+
+ public boolean linkedListCycle(ListNode l) {
+ if(l==null && l.next==null) {
+ return false;
+ }
+
+ ListNode slow=l,fast=l.next;
+ boolean cycle = false;
+
+ while(fast!=null && fast.next!=null) {
+ slow = slow.next;
+ fast = fast.next;
+ fast = fast.next;
+ if(slow==fast) {
+ cycle = true;
+ break;
+ }
+ }
+ return cycle;
+ }
+}
diff --git a/algorithm/src/main/java/linkedList/doublePointer/LinkedListCycleII.java b/algorithm/src/main/java/linkedList/doublePointer/LinkedListCycleII.java
new file mode 100644
index 0000000..e20d13e
--- /dev/null
+++ b/algorithm/src/main/java/linkedList/doublePointer/LinkedListCycleII.java
@@ -0,0 +1,31 @@
+package linkedList.doublePointer;
+
+/**
+ * 142. 环形链表 II
+ * 这道题属于数学知识+快慢指针
+ */
+
+public class LinkedListCycleII {
+
+ public int linkedListCycle(ListNode l) {
+ int pos = -1;
+ ListNode slow=l, fast=l;
+ while(fast!=null && fast.next!=null) {
+ slow = slow.next;
+ fast = fast.next;
+ fast = fast.next;
+ if(slow==fast) {
+ pos = 0;
+ slow = l;
+ while(slow!=fast) {
+ slow = slow.next;
+ fast = fast.next;
+ pos++;
+ return pos;
+ }
+ }
+ }
+ return pos;
+ }
+
+}
diff --git a/algorithm/src/main/java/linkedList/doublePointer/LinkedListIntersect.java b/algorithm/src/main/java/linkedList/doublePointer/LinkedListIntersect.java
new file mode 100644
index 0000000..9ae612e
--- /dev/null
+++ b/algorithm/src/main/java/linkedList/doublePointer/LinkedListIntersect.java
@@ -0,0 +1,28 @@
+package linkedList.doublePointer;
+
+/**
+ * 160. 相交链表
+ */
+
+
+import linkedList.doublePointer.ListNode;
+
+public class LinkedListIntersect {
+
+ public ListNode intersect(ListNode l1, ListNode l2) {
+ ListNode p1=l1, p2=l2;
+ while(p1!=p2) {
+ if(p1==null) {
+ p1 = l2;
+ }else{
+ p1 = p1.next;
+ }
+ if(p2==null) {
+ p2 = l1;
+ }else{
+ p2 = p2.next;
+ }
+ }
+ return p1;
+ }
+}
diff --git a/algorithm/src/main/java/linkedList/doublePointer/ListNode.java b/algorithm/src/main/java/linkedList/doublePointer/ListNode.java
new file mode 100644
index 0000000..bbf8972
--- /dev/null
+++ b/algorithm/src/main/java/linkedList/doublePointer/ListNode.java
@@ -0,0 +1,43 @@
+package linkedList.doublePointer;
+
+public class ListNode {
+ public int val;
+ public ListNode next;
+
+ ListNode() {}
+ public ListNode(int val) {
+ this.val = val;
+ }
+ ListNode(int val, ListNode next) {
+ this.val = val;
+ this.next = next;
+ }
+
+ public static ListNode numsToListNode(int[] nums) {
+ ListNode dummy = new ListNode(-1);
+ ListNode p=dummy;
+ for(int n: nums) {
+ p.next = new ListNode(n);
+ p = p.next;
+ }
+ return dummy.next;
+ }
+
+ public static int[] listNodeToNum(ListNode l) {
+ int size = 0;
+ ListNode p = l;
+ while(p!=null) {
+ size++;
+ p = p.next;
+ }
+
+ int[] nums = new int[size];
+ p = l;
+ for(int i=0;i pq = new PriorityQueue<>(
+ lists.length,(a,b) -> (a.val-b.val));
+
+ for(ListNode header : lists) {
+ if(header!=null) {
+ pq.add(header);
+ }
+ }
+
+ while(!pq.isEmpty()) {
+ ListNode node = pq.poll();
+ p.next = node;
+ p = p.next;
+ if(node.next!=null) {
+ pq.add(node.next);
+ }
+ }
+
+ return dummy.next;
+
+ }
+}
diff --git a/algorithm/src/main/java/linkedList/doublePointer/MergeSortedList.java b/algorithm/src/main/java/linkedList/doublePointer/MergeSortedList.java
new file mode 100644
index 0000000..6e30d58
--- /dev/null
+++ b/algorithm/src/main/java/linkedList/doublePointer/MergeSortedList.java
@@ -0,0 +1,34 @@
+package linkedList.doublePointer;
+
+/**
+ * 21. 合并两个有序链表
+ */
+
+import linkedList.doublePointer.ListNode;
+
+public class MergeSortedList {
+
+ public ListNode mergeSortedList(ListNode l1, ListNode l2) {
+ ListNode p1=l1, p2=l2, dummy=new ListNode(-1);
+ ListNode p = dummy;
+ while(p1!=null || p2!=null) {
+ if(p1!=null && p2!=null) {
+ if(p1.val{
+ try {
+ obj.fizz(new Runnable() {
+ @Override
+ public void run() {
+ System.out.print(",fizz");
+ }
+ });
+ } catch (InterruptedException | BrokenBarrierException e) {
+ e.printStackTrace();
+ }
+ }).start();
+
+ new Thread(() -> {
+ try {
+ obj.buzz(new Runnable() {
+ @Override
+ public void run() {
+ System.out.print(",buzz");
+ }
+ });
+ } catch (InterruptedException | BrokenBarrierException e) {
+ e.printStackTrace();
+ }
+ }).start();
+
+
+ new Thread(() -> {
+ try {
+ obj.fizzBuzz(new Runnable() {
+ @Override
+ public void run() {
+ System.out.print(",fizzbuzz");
+ }
+ });
+ } catch (InterruptedException | BrokenBarrierException e) {
+ e.printStackTrace();
+ }
+ }).start();
+
+ new Thread(() -> {
+ try {
+ obj.number(new IntConsumer());
+ } catch (InterruptedException | BrokenBarrierException e) {
+ e.printStackTrace();
+ }
+ }).start();
+
+ }
+
+
+
+}
diff --git a/algorithm/src/main/java/multiThread/FizzBuzzIII.java b/algorithm/src/main/java/multiThread/FizzBuzzIII.java
new file mode 100644
index 0000000..59de1c7
--- /dev/null
+++ b/algorithm/src/main/java/multiThread/FizzBuzzIII.java
@@ -0,0 +1,103 @@
+package multiThread;
+
+import java.util.Scanner;
+import java.util.concurrent.Semaphore;
+
+
+
+/**
+ * 1195 交替打印字符串
+ */
+
+public class FizzBuzzIII {
+ int n;
+ public Semaphore number = new Semaphore(1);
+ public Semaphore fizz = new Semaphore(0);
+ public Semaphore buzz = new Semaphore(0);
+ public Semaphore fizzBuzz = new Semaphore(0);
+
+ public FizzBuzzIII(int n) {
+ this.n = n;
+ }
+
+ public void printFizz() throws InterruptedException {
+ for(int i=1; i<=n; i++) {
+ fizz.acquire();
+ if(i%3==0 && i%5!=0) {
+ System.out.print("fizz ");
+ }
+ buzz.release();
+ }
+ }
+
+ public void printBuzz() throws InterruptedException {
+ for(int i=1; i<=n; i++) {
+ buzz.acquire();
+ if(i%3!=0 && i%5==0) {
+ System.out.print("buzz ");
+ }
+ fizzBuzz.release();
+ }
+ }
+
+ public void printFizzBuzz() throws InterruptedException {
+ for(int i=1; i<=n;i++) {
+ fizzBuzz.acquire();
+ if(i%15==0) {
+ System.out.print("fizzbuzz ");
+ }
+ number.release();
+ }
+ }
+
+ public void printNumber() throws InterruptedException {
+ for(int i=1;i<=n;i++) {
+ number.acquire();
+ if(i%3!=0 && i%5!=0) {
+ System.out.print(i+" ");
+ }
+ fizz.release();
+ }
+ }
+
+ public static void main(String[] args) {
+ Scanner sc = new Scanner(System.in);
+ int n = Integer.parseInt(sc.nextLine().trim());
+
+ FizzBuzzIII obj = new FizzBuzzIII(n);
+
+ new Thread(() -> {
+ try {
+ obj.printBuzz();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }).start();
+ new Thread(() -> {
+ try {
+ obj.printFizz();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }).start();
+
+ new Thread(() -> {
+ try {
+ obj.printFizzBuzz();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }).start();
+
+ new Thread(() -> {
+ try {
+ obj.printNumber();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }).start();
+
+
+
+ }
+}
diff --git a/algorithm/src/main/java/multiThread/PrintFooBarAlternately.java b/algorithm/src/main/java/multiThread/PrintFooBarAlternately.java
new file mode 100644
index 0000000..d666897
--- /dev/null
+++ b/algorithm/src/main/java/multiThread/PrintFooBarAlternately.java
@@ -0,0 +1,79 @@
+package multiThread;
+
+import java.util.Scanner;
+import java.util.concurrent.locks.ReentrantLock;
+
+/**
+ * 1115 交替打印FooBar
+ */
+
+public class PrintFooBarAlternately {
+
+ private int n;
+ ReentrantLock lock = new ReentrantLock();
+ int state=0;
+
+ public PrintFooBarAlternately(int n) {
+ this.n = n;
+ }
+
+ public Runnable printFoo() {
+ return new Runnable() {
+ @Override
+ public void run() {
+ System.out.print("foo");
+ }
+ };
+ }
+
+ public Runnable printBar() {
+ return new Runnable() {
+ @Override
+ public void run() {
+ System.out.print("bar");
+ }
+ };
+ }
+
+ public void foo(Runnable printFoo) {
+ for(int i=0;i {
+ print.foo(print.printFoo());
+ }).start();
+
+ new Thread(() -> {
+ print.bar(print.printBar());
+ }).start();
+
+ }
+}
diff --git a/algorithm/src/main/java/multiThread/PrintInOrder.java b/algorithm/src/main/java/multiThread/PrintInOrder.java
new file mode 100644
index 0000000..0519970
--- /dev/null
+++ b/algorithm/src/main/java/multiThread/PrintInOrder.java
@@ -0,0 +1,117 @@
+package multiThread;
+
+
+
+
+import org.apache.commons.lang3.time.StopWatch;
+
+import java.util.ArrayList;
+import java.util.Scanner;
+import java.util.concurrent.locks.ReentrantLock;
+
+/**
+ * 1114 按序打印
+ * 使用可重入锁 ReentrantLock
+ */
+
+
+
+public class PrintInOrder {
+
+ int state = 0;
+ ReentrantLock lock = new ReentrantLock();
+
+
+ public PrintInOrder() {
+ }
+
+ public Runnable printFirst() {
+ return new Runnable() {
+ @Override
+ public void run() {
+ System.out.print("first");
+ }
+ };
+ }
+
+ public Runnable printSecond() {
+ return new Runnable() {
+ @Override
+ public void run() {
+ System.out.print("second");
+ }
+ };
+ }
+
+ public Runnable printThird() {
+ return new Runnable() {
+ @Override
+ public void run() {
+ System.out.print("third");
+ }
+ };
+ }
+
+ public void first(Runnable printFirst) {
+ lock.lock();
+ printFirst.run();
+ state++;
+ lock.unlock();
+
+ }
+
+ public void second(Runnable printSecond) {
+ while(state!=1) {}
+ lock.lock();
+ printSecond.run();
+ state++;
+ lock.unlock();
+ }
+
+
+
+ public void third(Runnable printThird) {
+ while (state != 2) {}
+ lock.lock();
+ printThird.run();
+ state++;
+ lock.unlock();
+ }
+
+
+ public static void main(String[] args) throws InterruptedException {
+ PrintInOrder foo = new PrintInOrder();
+
+ Thread thread1 = new Thread(() -> {
+ foo.first(foo.printFirst());
+ });
+
+ Thread thread2 = new Thread(() -> {
+ foo.second(foo.printSecond());
+ });
+
+ Thread thread3 = new Thread(() -> {
+ foo.third(foo.printThird());
+ });
+
+ // 使用apache.commons的SopWatch计算程序耗时
+ StopWatch watch = new StopWatch();
+ watch.start();
+
+ thread1.start();
+ thread2.start();
+ thread3.start();
+
+ // 让程序依次执行完成
+ thread1.join();
+ thread2.join();
+ thread3.join();
+
+ watch.stop();
+ System.out.println("cost time: "+ watch.getTime()+"ms"); // 6ms
+
+
+
+
+ }
+}
\ No newline at end of file
diff --git a/algorithm/src/main/java/multiThread/PrintInOrder2.java b/algorithm/src/main/java/multiThread/PrintInOrder2.java
new file mode 100644
index 0000000..f96865b
--- /dev/null
+++ b/algorithm/src/main/java/multiThread/PrintInOrder2.java
@@ -0,0 +1,107 @@
+package multiThread;
+
+ import org.apache.commons.lang3.time.StopWatch;
+
+ import java.util.concurrent.locks.ReentrantLock;
+
+/**
+ * 1114 按序打印
+ *
+ * 使用synchronized锁
+ */
+
+
+
+public class PrintInOrder2 {
+
+ int state = 0;
+// ReentrantLock lock = new ReentrantLock();
+
+
+ public PrintInOrder2() {
+ }
+
+ public Runnable printFirst() {
+ return new Runnable() {
+ @Override
+ public void run() {
+ System.out.print("first");
+ }
+ };
+ }
+
+ public Runnable printSecond() {
+ return new Runnable() {
+ @Override
+ public void run() {
+ System.out.print("second");
+ }
+ };
+ }
+
+ public Runnable printThird() {
+ return new Runnable() {
+ @Override
+ public void run() {
+ System.out.print("third");
+ }
+ };
+ }
+
+ public void first(Runnable printFirst) {
+ synchronized (this) {
+ printFirst.run();
+ state++;
+ }
+
+ }
+
+ public void second(Runnable printSecond) {
+ while(state!=1) {}
+ synchronized (this) {
+ printSecond.run();
+ state++;
+ }
+ }
+
+
+
+ public void third(Runnable printThird) {
+ while (state != 2) {}
+ synchronized (this) {
+ printThird.run();
+ state++;
+ }
+ }
+
+
+ public static void main(String[] args) throws InterruptedException {
+ PrintInOrder2 foo = new PrintInOrder2();
+
+ Thread thread1 = new Thread(() -> {
+ foo.first(foo.printFirst());
+ });
+
+ Thread thread2 = new Thread(() -> {
+ foo.second(foo.printSecond());
+ });
+
+ Thread thread3 = new Thread(() -> {
+ foo.third(foo.printThird());
+ });
+
+ StopWatch watch = new StopWatch();
+ watch.start();
+
+ thread1.start();
+ thread2.start();
+ thread3.start();
+
+ thread1.join();
+ thread2.join();
+ thread3.join();
+
+ watch.stop();
+ System.out.println("cost time: " + watch.getTime()+"ms"); // 5ms
+ }
+}
\ No newline at end of file
diff --git a/algorithm/src/main/java/multiThread/PrintInOrder3.java b/algorithm/src/main/java/multiThread/PrintInOrder3.java
new file mode 100644
index 0000000..ca3948d
--- /dev/null
+++ b/algorithm/src/main/java/multiThread/PrintInOrder3.java
@@ -0,0 +1,100 @@
+package multiThread;
+
+import org.apache.commons.lang3.time.StopWatch;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * 1114 按序打印
+ *
+ * 使用synchronized锁
+ */
+
+
+
+public class PrintInOrder3 {
+
+ AtomicInteger state = new AtomicInteger(0);
+// ReentrantLock lock = new ReentrantLock();
+
+
+ public PrintInOrder3() {
+ }
+
+ public Runnable printFirst() {
+ return new Runnable() {
+ @Override
+ public void run() {
+ System.out.print("first");
+ }
+ };
+ }
+
+ public Runnable printSecond() {
+ return new Runnable() {
+ @Override
+ public void run() {
+ System.out.print("second");
+ }
+ };
+ }
+
+ public Runnable printThird() {
+ return new Runnable() {
+ @Override
+ public void run() {
+ System.out.print("third");
+ }
+ };
+ }
+
+ public void first(Runnable printFirst) {
+ printFirst.run();
+ state.incrementAndGet();
+
+ }
+
+ public void second(Runnable printSecond) {
+ while(state.get()!=1) {}
+ printSecond.run();
+ state.incrementAndGet();
+ }
+
+
+
+ public void third(Runnable printThird) {
+ while (state.get() != 2) {}
+ printThird.run();
+ state.incrementAndGet();
+ }
+
+
+ public static void main(String[] args) throws InterruptedException {
+ PrintInOrder3 foo = new PrintInOrder3();
+
+ Thread thread1 = new Thread(() -> {
+ foo.first(foo.printFirst());
+ });
+
+ Thread thread2 = new Thread(() -> {
+ foo.second(foo.printSecond());
+ });
+
+ Thread thread3 = new Thread(() -> {
+ foo.third(foo.printThird());
+ });
+ StopWatch watch = new StopWatch();
+ watch.start();
+
+ thread1.start();
+ thread2.start();
+ thread3.start();
+
+ thread1.join();
+ thread2.join();
+ thread3.join();
+
+ watch.stop();
+ System.out.println("cost time: "+watch.getTime()+"ms"); // 7ms
+ }
+}
\ No newline at end of file
diff --git a/algorithm/src/main/java/multiThread/PrintZeroOddEven.java b/algorithm/src/main/java/multiThread/PrintZeroOddEven.java
new file mode 100644
index 0000000..0f4794f
--- /dev/null
+++ b/algorithm/src/main/java/multiThread/PrintZeroOddEven.java
@@ -0,0 +1,68 @@
+package multiThread;
+
+import java.util.Scanner;
+import java.util.concurrent.locks.ReentrantLock;
+
+/**
+ * 1115 打印零和奇偶数
+ */
+
+public class PrintZeroOddEven {
+ private int n;
+ int state=1;
+ boolean zeroState=true;
+ ReentrantLock lock = new ReentrantLock();
+
+ public PrintZeroOddEven(int n) {
+ this.n = n;
+ }
+
+ // printNumber.accept(x) outputs "x", where x is an integer.
+ public void zero() {
+ while(state<=2*n) {
+ lock.lock();
+ if(state<=2*n && zeroState) {
+ System.out.print(0);
+ zeroState=false;
+ }
+ lock.unlock();
+ }
+ }
+
+ public void even() {
+ while(state<=2*n) {
+ lock.lock();
+ if(state<=2*n && !zeroState && state%2==0) {
+ System.out.print(state);
+ zeroState=true;
+ state++;
+ }
+ lock.unlock();
+ }
+ }
+
+ public void odd(){
+ while(state<=2*n) {
+ lock.lock();
+ if(state<=2*n && !zeroState && state%2==1) {
+ System.out.print(state);
+ zeroState=true;
+ state++;
+ }
+ lock.unlock();
+ }
+
+ }
+
+ public static void main(String[] args){
+ Scanner sc = new Scanner(System.in);
+ int n = Integer.parseInt(sc.nextLine().trim());
+ PrintZeroOddEven obj = new PrintZeroOddEven(n);
+ new Thread(obj::zero).start();
+
+ new Thread(obj::odd).start();
+
+ new Thread(obj::even).start();
+
+ }
+}
diff --git a/algorithm/src/main/java/multiThread/ProduceH2O.java b/algorithm/src/main/java/multiThread/ProduceH2O.java
new file mode 100644
index 0000000..fa41970
--- /dev/null
+++ b/algorithm/src/main/java/multiThread/ProduceH2O.java
@@ -0,0 +1,30 @@
+package multiThread;
+
+import java.util.concurrent.locks.ReentrantLock;
+
+public class ProduceH2O {
+
+ String water;
+ int state=0;
+ ReentrantLock lock = new ReentrantLock();
+
+ public ProduceH2O(String water) {
+ this.water = water;
+ }
+
+ public void hydrogen() {
+ while(state> nSum(int[] nums, int target, int N) {
+ Arrays.sort(nums);
+ return nSumHelper(nums, target, N, 0);
+ }
+
+ // 在这里,N大于2
+ ArrayList> nSumHelper(int[] nums, int target, int N, int start){
+ // 小于两个数相加 或者 起点到终点的元素个数小于N
+ if(N<2 || start+N>nums.length) {
+ return new ArrayList>();
+ }
+ else if(N==2) {
+ int low=start, high=nums.length-1;
+ ArrayList> twoRes = new ArrayList>();
+ while(lowtarget) {
+ high--;
+ }else {
+ ArrayList temp = new ArrayList();
+ temp.add(nums[low]);
+ temp.add(nums[high]);
+ twoRes.add(temp);
+ int origin = nums[low];
+ low++;
+ while(origin==nums[low] && low> part = nSumHelper(nums, target - nums[start], N - 1, start+1);
+ if (part.size() > 0) {
+ for (ArrayList integers : part) {
+ integers.add(0, nums[start]);
+ }
+ }
+ return part;
+
+ }
+ }
+
+
+}
diff --git a/algorithm/src/main/java/nSum/ThreeSum.java b/algorithm/src/main/java/nSum/ThreeSum.java
new file mode 100644
index 0000000..1b9ebce
--- /dev/null
+++ b/algorithm/src/main/java/nSum/ThreeSum.java
@@ -0,0 +1,51 @@
+package nSum;
+
+import java.lang.reflect.Array;
+import java.util.ArrayList;
+import java.util.Arrays;
+
+public class ThreeSum {
+
+ // 规定遍历的起点,防止出现重复计算
+ // 在这里假设已经排号序了,从小到大
+ private ArrayList> twoSum(int[] nums, int target, int start) {
+ ArrayList> res = new ArrayList>();
+ int low = start;
+ int high = nums.length-1;
+ while(lowtarget) {
+ high--;
+ }else {
+ ArrayList tempList = new ArrayList();
+ tempList.add(nums[low]);
+ tempList.add(nums[high]);
+ res.add(tempList);
+ int temp = nums[low];
+ low++;
+ while(temp==nums[low] && low> threeSum(int[] nums, int target){
+ Arrays.sort(nums);
+ ArrayList> res= new ArrayList>();
+ for(int i=0;i> part = twoSum(nums, target-nums[i], i+1);
+ if(part.size()>0) {
+ for(int j=0;i temp = new ArrayList();
+ part.get(j).add(0, nums[i]);
+ res.add(part.get(j));
+ }
+ }
+ }
+ return res;
+ }
+}
diff --git a/algorithm/src/main/java/nSum/TwoSum.java b/algorithm/src/main/java/nSum/TwoSum.java
new file mode 100644
index 0000000..c1b9177
--- /dev/null
+++ b/algorithm/src/main/java/nSum/TwoSum.java
@@ -0,0 +1,60 @@
+package nSum;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+
+/**
+ * 1. 输入的数据为整形,顺序随机
+ * 2.
+ */
+
+public class TwoSum {
+ public ArrayList> twoSum(int[] nums, int target) {
+ // 对数组进行排序,默认从小到大排序
+ // 如果需要降序,那么添加Collections.reverseOrder()属性
+ Arrays.sort(nums);
+ int low=0, high=nums.length-1;
+// System.out.println(nums.length); // 4
+ ArrayList> list = new ArrayList>();
+ while(lowtarget) {
+ high--;
+
+ // 相等时存储
+ }else {
+ ArrayList temp = new ArrayList();
+ temp.add(nums[low]);
+ temp.add(nums[high]);
+ list.add(temp);
+ int origin = nums[low];
+ low++;
+ while(origin == nums[low] && low> res = solution.twoSum(nums, 5);
+ for(int i=0;i map = new HashMap();
+ HashSet visited = new HashSet<>();
+ int p=0;
+ while(p t
+ // 之前有映射值与当前值不同
+ if(map.containsKey(c1) && map.get(c1)!=c2){
+ return false;
+ }
+
+ // 当前没有映射值,但映射的目标值已经存在,即多个起点映射到一个终点
+ if(!map.containsKey(c1) && visited.contains(c2)){
+ return false;
+ }
+
+ if(!map.containsKey(c1)) {
+ map.put(c1, c2);
+ visited.add(c2);
+ }
+
+ p++;
+ }
+ return true;
+ }
+}
diff --git a/algorithm/src/main/java/prefixSum/MatrixSum.java b/algorithm/src/main/java/prefixSum/MatrixSum.java
new file mode 100644
index 0000000..a780522
--- /dev/null
+++ b/algorithm/src/main/java/prefixSum/MatrixSum.java
@@ -0,0 +1,33 @@
+package prefixSum;
+
+/**
+ * 1314. 矩阵区域和
+ */
+
+public class MatrixSum {
+
+
+ public int[][] matrixSum(int[][] matrix, int k) {
+ // 计算矩阵和
+ int[][] sum = new int[matrix.length+1][matrix[0].length+1];
+ for(int i=0;iright || right>=nums.length-1)
+ return -1;
+ return nums[right+1]-nums[left];
+ }
+}
\ No newline at end of file
diff --git a/algorithm/src/main/java/prefixSum/NumMatrix.java b/algorithm/src/main/java/prefixSum/NumMatrix.java
new file mode 100644
index 0000000..8795f64
--- /dev/null
+++ b/algorithm/src/main/java/prefixSum/NumMatrix.java
@@ -0,0 +1,32 @@
+package prefixSum;
+
+/**
+ * 304. ⼆维区域和检索 - 矩阵不可变
+ */
+
+public class NumMatrix {
+
+ private int[][] matrix;
+
+ public NumMatrix(int[][] matrix) {
+
+ this.matrix = new int[matrix.length+1][matrix[0].length+1];
+ // 初始值为0
+// System.out.println(matrix[0][0]);
+ for(int i=0;i list = new ArrayList<>();
+ private List product = new ArrayList<>();
+
+ public ProductOfNumbers() {
+ // 标准操作
+ product.add(1);
+ }
+
+ public void add(int num) {
+ list.add(num);
+ if(num==0) {
+ product.clear();
+ product.add(1);
+ } else {
+ int res = product.get(product.size()-1)*num;
+ product.add(res);
+ }
+ }
+
+ public int getProduct(int k) {
+ if(k>=product.size()) {
+ return 0;
+ } else {
+ int n = product.size();
+ return product.get(n-1)/product.get(n-k-1);
+ }
+ }
+}
diff --git a/algorithm/src/main/java/stack_queue/EvalRPN.java b/algorithm/src/main/java/stack_queue/EvalRPN.java
new file mode 100644
index 0000000..0267637
--- /dev/null
+++ b/algorithm/src/main/java/stack_queue/EvalRPN.java
@@ -0,0 +1,41 @@
+package stack_queue;
+
+import java.util.Stack;
+
+/**
+ * 150. 逆波兰表达式求值
+ */
+
+public class EvalRPN {
+
+ int evalRPN(String[] tokens) {
+ Integer res;
+ Stack stack = new Stack<>();
+ for(int i=0;i stack = new Stack<>();
+
+ void push(int x) {
+ if(stack.isEmpty()) {
+ peekValue = x;
+ }
+ stack.push(x);
+ }
+
+ int pop() {
+ Stack temp = new Stack<>();
+ int sz = stack.size();
+ while (sz>2) {
+ temp.push(stack.pop());
+ sz--;
+ }
+ if(sz==2) {
+ peekValue = stack.peek();
+ temp.push(stack.pop());
+ }else {
+ peekValue = -1;
+ }
+ int res = stack.pop();
+
+ while (!temp.isEmpty()) {
+ stack.push(temp.pop());
+ }
+ return res;
+ }
+
+ int peek() {
+ return peekValue;
+ }
+
+ boolean empty() {
+ return stack.isEmpty();
+ }
+}
diff --git a/algorithm/src/main/java/stack_queue/ImplementStackUsingQueues.java b/algorithm/src/main/java/stack_queue/ImplementStackUsingQueues.java
new file mode 100644
index 0000000..70889ec
--- /dev/null
+++ b/algorithm/src/main/java/stack_queue/ImplementStackUsingQueues.java
@@ -0,0 +1,44 @@
+package stack_queue;
+
+import java.util.LinkedList;
+import java.util.Queue;
+import java.util.Stack;
+
+/**
+ * 255 用队列实现栈
+ */
+
+public class ImplementStackUsingQueues {
+ private int peekValue=-1;
+ Queue queue =new LinkedList<>();
+
+ void push(int x) {
+ queue.offer(x);
+ peekValue = x;
+ }
+
+ int pop() {
+ int sz = queue.size();
+ while (sz>2) {
+ queue.offer(queue.poll());
+ sz--;
+ }
+ if(sz==2) {
+ peekValue = queue.peek();
+ queue.offer(queue.poll());
+ }else {
+ peekValue = -1;
+ }
+ int res = queue.poll();
+ return res;
+ }
+
+ int peek() {
+ return peekValue;
+ }
+
+ boolean empty() {
+ return queue.isEmpty();
+ }
+
+}
diff --git a/algorithm/src/main/java/stack_queue/LongestValidParentheses.java b/algorithm/src/main/java/stack_queue/LongestValidParentheses.java
new file mode 100644
index 0000000..ed655a2
--- /dev/null
+++ b/algorithm/src/main/java/stack_queue/LongestValidParentheses.java
@@ -0,0 +1,40 @@
+package stack_queue;
+
+import java.util.Stack;
+
+/**
+ * 32. 最长有效括号
+ */
+
+public class LongestValidParentheses {
+
+ public int longestValidParentheses(String s) {
+ int res=0;
+ int[] dp = new int[s.length()+1];
+ Stack stack = new Stack<>();
+ dp[0] = 0;
+
+ for(int i=0;i stack = new Stack<>();
+ private Stack min = new Stack<>();
+
+ public MinStack() {
+
+ }
+
+ public void push(int val) {
+ stack.push(val);
+ if(min.isEmpty()) {
+ min.push(val);
+ } else {
+ Integer res = Math.min(min.peek(), val);
+ min.push(res);
+ }
+ }
+
+ public void pop() {
+ stack.pop();
+ min.pop();
+ }
+
+ public int top() {
+ return stack.peek();
+ }
+
+ public int getMin() {
+ return min.peek();
+ }
+
+}
diff --git a/algorithm/src/main/java/stack_queue/MinimumInsertionsToBalanceParentheses.java b/algorithm/src/main/java/stack_queue/MinimumInsertionsToBalanceParentheses.java
new file mode 100644
index 0000000..92cff2e
--- /dev/null
+++ b/algorithm/src/main/java/stack_queue/MinimumInsertionsToBalanceParentheses.java
@@ -0,0 +1,38 @@
+package stack_queue;
+
+import java.util.Queue;
+import java.util.Stack;
+
+/**
+ * 1541. 平衡括号字符串的最少插入次数
+ */
+public class MinimumInsertionsToBalanceParentheses {
+
+
+// 方法1
+ public int minInsert(String s){
+ int res=0, need=0;
+
+ for(int i=0;i stack = new Stack<>();
+ for(String part: parts) {
+ if(part.isEmpty() || part.equals(".")) {
+ continue;
+ }
+ if(part.equals("..")) {
+ if(!stack.isEmpty()) {
+ stack.pop();
+ }
+ continue;
+
+ } else {
+ stack.push(part);
+ }
+ }
+
+ while (!stack.isEmpty()) {
+ res = "/"+stack.pop()+res;
+ }
+
+ if(res.equals("")) {
+ res = "/";
+ }
+
+ return res;
+ }
+}
diff --git a/algorithm/src/main/java/stack_queue/SlidingWindowMax.java b/algorithm/src/main/java/stack_queue/SlidingWindowMax.java
new file mode 100644
index 0000000..fcabc4e
--- /dev/null
+++ b/algorithm/src/main/java/stack_queue/SlidingWindowMax.java
@@ -0,0 +1,55 @@
+package stack_queue;
+
+/**
+ * [239. 滑动窗口最大值]
+ */
+
+import java.util.LinkedList;
+
+class MonotonicQueue {
+ LinkedList max = new LinkedList();
+ int length;
+
+ public MonotonicQueue(int length) {
+ this.length = length;
+ }
+
+ public void push(Integer num) {
+ // 将⼩于 n 的元素全部删除
+ while (!max.isEmpty() && max.getLast() < num) {
+ max.pollLast(); // 从后往前删除
+ }
+ // 将数值加入尾部
+ max.addLast(num);
+
+ // 如果超过链表容量,则移除第一个元素
+ if (max.size() > length) {
+ max.removeFirst(); // 移除首元素
+ }
+ }
+
+ public int getMax() {
+ return max.getFirst();
+ }
+}
+
+public class SlidingWindowMax {
+
+ public int[] slidingWindowMax(int[] nums, int k) {
+ int[] res = new int[nums.length+1-k];
+ MonotonicQueue queue = new MonotonicQueue(k);
+
+ for(int i=0;i stack = new Stack<>();
+ for(int i=0;i> res = solver.binaryTreeLevelOrderTraverseII(root);
+ for(ArrayList t: res) {
+ System.out.println(t);
+ /**
+ * [15, 7]
+ * [9, 30]
+ * [3]
+ */
+ }
+ }
+}
diff --git a/algorithm/src/test/java/BSF_DSF/BinaryTreeLevelOrderTraversalTest.java b/algorithm/src/test/java/BSF_DSF/BinaryTreeLevelOrderTraversalTest.java
new file mode 100644
index 0000000..15e356a
--- /dev/null
+++ b/algorithm/src/test/java/BSF_DSF/BinaryTreeLevelOrderTraversalTest.java
@@ -0,0 +1,30 @@
+package BSF_DSF;
+
+import BFS_DFS.BinaryTreeLevelOrderTraversal;
+import binaryTree.TreeNode;
+import org.junit.Test;
+
+import java.util.ArrayList;
+
+public class BinaryTreeLevelOrderTraversalTest {
+
+ BinaryTreeLevelOrderTraversal solver = new BinaryTreeLevelOrderTraversal();
+
+ @Test
+ public void testOne() {
+ int[] nums = new int[] {3,9,20,-1,-1,15,7};
+ TreeNode root = TreeNode.numsToTreeNode(nums);
+ ArrayList> res = solver.binaryTreeLevelOrderTraversal(root);
+ for(ArrayList t: res) {
+ System.out.println(t);
+ /**
+ * [
+ * [3],
+ * [9,20],
+ * [15,7]
+ * ]
+ */
+ }
+
+ }
+}
diff --git a/algorithm/src/test/java/BSF_DSF/BinaryTreeZigzagLevelOrderTraversalTest.java b/algorithm/src/test/java/BSF_DSF/BinaryTreeZigzagLevelOrderTraversalTest.java
new file mode 100644
index 0000000..9d68f48
--- /dev/null
+++ b/algorithm/src/test/java/BSF_DSF/BinaryTreeZigzagLevelOrderTraversalTest.java
@@ -0,0 +1,61 @@
+package BSF_DSF;
+
+
+import BFS_DFS.BinaryTreeZigzagLevelOrderTraversal;
+import binaryTree.TreeNode;
+import org.junit.Test;
+
+import java.util.ArrayList;
+
+public class BinaryTreeZigzagLevelOrderTraversalTest {
+
+
+ BinaryTreeZigzagLevelOrderTraversal solver = new BinaryTreeZigzagLevelOrderTraversal();
+
+ @Test
+ public void testOne() {
+ int[] nums = new int[] {3, 9, 20, -1, -1, 15, 7};
+ TreeNode root = TreeNode.numsToTreeNode(nums);
+ ArrayList> res = solver.binaryTreeZigzagLevelOrderTraversal(root);
+
+ for(ArrayList t: res) {
+ System.out.println(t);
+ /**
+ * [3]
+ * [20, 9]
+ * [15, 7]
+ */
+ }
+ }
+
+ @Test
+ public void testTwo() {
+ int[] nums = new int[] {3};
+ TreeNode root = TreeNode.numsToTreeNode(nums);
+ ArrayList> res = solver.binaryTreeZigzagLevelOrderTraversal(root);
+
+ for(ArrayList t: res) {
+ System.out.println(t);
+ /**
+ * [3]
+ */
+ }
+ }
+
+ @Test
+ public void testThree() {
+ int[] nums = new int[] {};
+ TreeNode root = TreeNode.numsToTreeNode(nums);
+ ArrayList> res = solver.binaryTreeZigzagLevelOrderTraversal(root);
+
+ for(ArrayList t: res) {
+ System.out.println(t);
+ /**
+ * 空
+ */
+ }
+ }
+
+
+
+}
diff --git a/algorithm/src/test/java/BSF_DSF/CountSubIslandsTest.java b/algorithm/src/test/java/BSF_DSF/CountSubIslandsTest.java
new file mode 100644
index 0000000..d37ded1
--- /dev/null
+++ b/algorithm/src/test/java/BSF_DSF/CountSubIslandsTest.java
@@ -0,0 +1,53 @@
+package BSF_DSF;
+
+import BFS_DFS.CountSubIslands;
+import org.junit.Test;
+
+public class CountSubIslandsTest {
+
+ CountSubIslands solver = new CountSubIslands();
+
+ @Test
+ public void testOne() {
+ int[][] grid1 = new int[][]{
+ {1,1,1,0,0},
+ {0,1,1,1,1},
+ {0,0,0,0,0},
+ {1,0,0,0,0},
+ {1,1,0,1,1}
+ };
+ int[][] grid2 = new int[][]{
+ {1,1,1,0,0},
+ {0,0,1,1,1},
+ {0,1,0,0,0},
+ {1,0,1,1,0},
+ {0,1,0,1,0}
+ };
+
+ int res = solver.countSubIsland(grid1, grid2);
+ System.out.println(res);
+ // 3
+ }
+
+ @Test
+ public void testTwo() {
+ int[][] grid1 = new int[][]{
+ {1,0,1,0,1},
+ {1,1,1,1,1},
+ {0,0,0,0,0},
+ {1,1,1,1,1},
+ {1,0,1,0,1}
+ };
+ int[][] grid2 = new int[][]{
+ {0,0,0,0,0},
+ {1,1,1,1,1},
+ {0,1,0,1,0},
+ {0,1,0,1,0},
+ {1,0,0,0,1}
+ };
+
+ int res = solver.countSubIsland(grid1, grid2);
+ System.out.println(res);
+ // 2
+ }
+}
diff --git a/algorithm/src/test/java/BSF_DSF/MaxAreaIslandTest.java b/algorithm/src/test/java/BSF_DSF/MaxAreaIslandTest.java
new file mode 100644
index 0000000..34a70d3
--- /dev/null
+++ b/algorithm/src/test/java/BSF_DSF/MaxAreaIslandTest.java
@@ -0,0 +1,38 @@
+package BSF_DSF;
+
+import BFS_DFS.MaxAreaIsland;
+import org.junit.Test;
+
+public class MaxAreaIslandTest {
+
+ MaxAreaIsland solver = new MaxAreaIsland();
+
+ @Test
+ public void testOne() {
+ int[][] grid = {
+ {0,0,1,0,0,0,0,1,0,0,0,0,0},
+ {0,0,0,0,0,0,0,1,1,1,0,0,0},
+ {0,1,1,0,1,0,0,0,0,0,0,0,0},
+ {0,1,0,0,1,1,0,0,1,0,1,0,0},
+ {0,1,0,0,1,1,0,0,1,1,1,0,0},
+ {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}
+ };
+
+ int res = solver.maxAreaIsland(grid);
+ System.out.println(res);
+ // 6
+ }
+
+ @Test
+ public void testTwo() {
+ int[][] grid = {
+ {0,0,0,0,0,0,0,},
+ };
+
+ int res = solver.maxAreaIsland(grid);
+ System.out.println(res);
+ // 0
+ }
+}
diff --git a/algorithm/src/test/java/BSF_DSF/MinimumDepthBinaryTreeTest.java b/algorithm/src/test/java/BSF_DSF/MinimumDepthBinaryTreeTest.java
new file mode 100644
index 0000000..036a1cc
--- /dev/null
+++ b/algorithm/src/test/java/BSF_DSF/MinimumDepthBinaryTreeTest.java
@@ -0,0 +1,19 @@
+package BSF_DSF;
+
+import BFS_DFS.MinimumDepthBinaryTree;
+import binaryTree.TreeNode;
+import org.junit.Test;
+
+public class MinimumDepthBinaryTreeTest {
+
+ MinimumDepthBinaryTree solver = new MinimumDepthBinaryTree();
+
+ @Test
+ public void testOne() {
+ int[] nums = new int[]{3,9,20,-1,-1,15,7};
+ TreeNode root = TreeNode.numsToTreeNode(nums);
+ int res = solver.minimumDepthBinaryTree(root);
+ System.out.println(res);
+ // 2
+ }
+}
diff --git a/algorithm/src/test/java/BSF_DSF/NumberClosedIslandsTest.java b/algorithm/src/test/java/BSF_DSF/NumberClosedIslandsTest.java
new file mode 100644
index 0000000..6676b13
--- /dev/null
+++ b/algorithm/src/test/java/BSF_DSF/NumberClosedIslandsTest.java
@@ -0,0 +1,25 @@
+package BSF_DSF;
+
+import BFS_DFS.NumberClosedIslands;
+import BFS_DFS.NumberEnclaves;
+import org.junit.Test;
+
+public class NumberClosedIslandsTest {
+
+ NumberClosedIslands solver = new NumberClosedIslands();
+
+ @Test
+ public void testOne() {
+ int[][] grid = new int[][] {
+ {1,1,1,1,1,1,1,0},
+ {1,0,0,0,0,1,1,0},
+ {1,0,1,0,1,1,1,0},
+ {1,0,0,0,0,1,0,1},
+ {1,1,1,1,1,1,1,0}
+ };
+
+ int res = solver.numberClosedIslands(grid);
+ System.out.println(res);
+ // 2
+ }
+}
diff --git a/algorithm/src/test/java/BSF_DSF/NumberDistinctIslandsTest.java b/algorithm/src/test/java/BSF_DSF/NumberDistinctIslandsTest.java
new file mode 100644
index 0000000..b3eec3b
--- /dev/null
+++ b/algorithm/src/test/java/BSF_DSF/NumberDistinctIslandsTest.java
@@ -0,0 +1,38 @@
+package BSF_DSF;
+
+import BFS_DFS.NumberDistinctIslands;
+import BFS_DFS.NumberIslands;
+import org.junit.Test;
+
+public class NumberDistinctIslandsTest {
+
+ NumberDistinctIslands solver = new NumberDistinctIslands();
+
+ @Test
+ public void testOne() {
+ char[][] grid = {
+ {'1','1','0','0','0'},
+ {'1','1','0','0','0'},
+ {'0','0','0','1','1'},
+ {'0','0','0','1','1'},
+ };
+
+ int res = solver.numberDistinctIslands(grid);
+ System.out.println(res);
+ // 1
+ }
+
+ @Test
+ public void testTwo() {
+ char[][] grid = {
+ {'1','1','0','1','1'},
+ {'1','0','0','0','0'},
+ {'0','0','0','0','1'},
+ {'1','1','0','1','1'},
+ };
+
+ int res = solver.numberDistinctIslands(grid);
+ System.out.println(res);
+ // 3
+ }
+}
diff --git a/algorithm/src/test/java/BSF_DSF/NumberEnclavesTest.java b/algorithm/src/test/java/BSF_DSF/NumberEnclavesTest.java
new file mode 100644
index 0000000..ae5e0bf
--- /dev/null
+++ b/algorithm/src/test/java/BSF_DSF/NumberEnclavesTest.java
@@ -0,0 +1,22 @@
+package BSF_DSF;
+
+import BFS_DFS.NumberEnclaves;
+import org.junit.Test;
+
+public class NumberEnclavesTest {
+
+ NumberEnclaves solver = new NumberEnclaves();
+
+ @Test
+ public void testOne() {
+ int[][] grid = new int[][] {
+ {0,0,0,0},
+ {1,0,1,0},
+ {0,1,1,0},
+ {0,0,0,0}
+ };
+ int res = solver.numberEnclaves(grid);
+ System.out.println(res);
+ // 3
+ }
+}
diff --git a/algorithm/src/test/java/BSF_DSF/NumberIslandsTest.java b/algorithm/src/test/java/BSF_DSF/NumberIslandsTest.java
new file mode 100644
index 0000000..f7cf839
--- /dev/null
+++ b/algorithm/src/test/java/BSF_DSF/NumberIslandsTest.java
@@ -0,0 +1,37 @@
+package BSF_DSF;
+
+import BFS_DFS.NumberIslands;
+import org.junit.Test;
+
+public class NumberIslandsTest {
+ NumberIslands solver = new NumberIslands();
+
+ @Test
+ public void testOne() {
+ char[][] grid = {
+ {'1','1','1','1','0'},
+ {'1','1','0','1','0'},
+ {'1','1','0','0','0'},
+ {'0','0','0','0','0'}
+ };
+
+ int res = solver.numberIslands(grid);
+ System.out.println(res);
+ // 1
+ }
+
+ @Test
+ public void testTwo() {
+ char[][] grid = {
+ {'1','1','0','0','0'},
+ {'1','1','0','0','0'},
+ {'0','0','1','0','0'},
+ {'0','0','0','1','1'}
+ };
+
+ int res = solver.numberIslands(grid);
+ System.out.println(res);
+ // 3
+
+ }
+}
diff --git a/algorithm/src/test/java/BSF_DSF/OpenTheLockTest.java b/algorithm/src/test/java/BSF_DSF/OpenTheLockTest.java
new file mode 100644
index 0000000..9ed969f
--- /dev/null
+++ b/algorithm/src/test/java/BSF_DSF/OpenTheLockTest.java
@@ -0,0 +1,50 @@
+package BSF_DSF;
+
+import BFS_DFS.OpenTheLock;
+import org.junit.Test;
+
+import java.util.ArrayList;
+
+public class OpenTheLockTest {
+
+ OpenTheLock solver = new OpenTheLock();
+
+ @Test
+ public void testOne() {
+ ArrayList depends = new ArrayList<>();
+ depends.add("0201");
+ depends.add("0101");
+ depends.add("0102");
+ depends.add("1212");
+ depends.add("2002");
+ String target = "0202";
+
+ int res = solver.openTheLock(depends, target);
+ System.out.println(res);
+ /**
+ * 6
+ */
+
+ }
+
+ @Test
+ public void testTwo() {
+ ArrayList depends = new ArrayList<>();
+ depends.add("8887");
+ depends.add("8889");
+ depends.add("8878");
+ depends.add("8898");
+ depends.add("8788");
+ depends.add("8988");
+ depends.add("7888");
+ depends.add("9888");
+ String target = "8888";
+
+ int res = solver.openTheLock(depends, target);
+ System.out.println(res);
+ /**
+ * -1
+ */
+
+ }
+}
diff --git a/algorithm/src/test/java/BSF_DSF/SlidingPuzzleTest.java b/algorithm/src/test/java/BSF_DSF/SlidingPuzzleTest.java
new file mode 100644
index 0000000..59ad129
--- /dev/null
+++ b/algorithm/src/test/java/BSF_DSF/SlidingPuzzleTest.java
@@ -0,0 +1,41 @@
+package BSF_DSF;
+
+import BFS_DFS.SlidingPuzzle;
+import org.junit.Test;
+
+public class SlidingPuzzleTest {
+ SlidingPuzzle slover = new SlidingPuzzle();
+
+ @Test
+ public void testOne() {
+ int[][] nums = new int[][] {
+ {1,2,3},
+ {4,0,5}
+ };
+ int res = slover.slidingPuzzle(nums);
+ System.out.println(res);
+ // 1
+ }
+
+ @Test
+ public void testTwo() {
+ int[][] nums = new int[][] {
+ {1,2,3},
+ {5,4,0}
+ };
+ int res = slover.slidingPuzzle(nums);
+ System.out.println(res);
+ // -1
+ }
+
+ @Test
+ public void testThree() {
+ int[][] nums = new int[][] {
+ {4,1,2},
+ {5,0,3}
+ };
+ int res = slover.slidingPuzzle(nums);
+ System.out.println(res);
+ // 5
+ }
+}
diff --git a/algorithm/src/test/java/BSF_DSF/SurroundedRegionsTest.java b/algorithm/src/test/java/BSF_DSF/SurroundedRegionsTest.java
new file mode 100644
index 0000000..78542bd
--- /dev/null
+++ b/algorithm/src/test/java/BSF_DSF/SurroundedRegionsTest.java
@@ -0,0 +1,31 @@
+package BSF_DSF;
+
+import BFS_DFS.SurroundedRegions;
+import org.junit.Test;
+
+public class SurroundedRegionsTest {
+
+ SurroundedRegions solver = new SurroundedRegions();
+
+ @Test
+ public void testOne() {
+ char[][] board = new char[][]{
+ {'X','X','X','X'},
+ {'X','O','O','X'},
+ {'X','X','O','X'},
+ {'X','O','X','X'}
+ };
+
+ solver.surroundedRegions(board);
+ for(char[] t: board){
+ System.out.println(t);
+ /**
+ * XXXX
+ * XXXX
+ * XXXX
+ * XOXX
+ */
+ }
+
+ }
+}
diff --git a/algorithm/src/test/java/DP/BloodSimilarityTest.java b/algorithm/src/test/java/DP/BloodSimilarityTest.java
new file mode 100644
index 0000000..a466583
--- /dev/null
+++ b/algorithm/src/test/java/DP/BloodSimilarityTest.java
@@ -0,0 +1,15 @@
+package DP;
+
+import org.junit.Test;
+
+public class BloodSimilarityTest {
+ BloodSimilarity solver = new BloodSimilarity();
+
+ @Test
+ public void testOne() {
+ String str1 = "ACT";
+ String str2 = "AGCT";
+ int res = solver.bloodSimilarity(str1, str2);
+ System.out.println(res);
+ }
+}
diff --git a/algorithm/src/test/java/DP/DisjointLinesTest.java b/algorithm/src/test/java/DP/DisjointLinesTest.java
new file mode 100644
index 0000000..d36f94b
--- /dev/null
+++ b/algorithm/src/test/java/DP/DisjointLinesTest.java
@@ -0,0 +1,35 @@
+package DP;
+
+import org.junit.Test;
+
+public class DisjointLinesTest {
+
+ DisjointLines solver = new DisjointLines();
+
+ @Test
+ public void testOne() {
+ int[] nums1 = new int[]{1,4,2};
+ int[] nums2 = new int[]{1,2,4};
+ int res = solver.maxUncrossedLines(nums1, nums2);
+ System.out.println(res);
+ // 2
+ }
+
+ @Test
+ public void testTwo() {
+ int[] nums1 = new int[]{2,5,1,2,5};
+ int[] nums2 = new int[]{10,5,2,1,5,2};
+ int res = solver.maxUncrossedLines(nums1, nums2);
+ System.out.println(res);
+ // 3
+ }
+
+ @Test
+ public void testThree() {
+ int[] nums1 = new int[]{1,3,7,1,7,5};
+ int[] nums2 = new int[]{1,9,2,5,1};
+ int res = solver.maxUncrossedLines(nums1, nums2);
+ System.out.println(res);
+ // 2
+ }
+}
diff --git a/algorithm/src/test/java/DP/EnvelopsTest.java b/algorithm/src/test/java/DP/EnvelopsTest.java
new file mode 100644
index 0000000..0615400
--- /dev/null
+++ b/algorithm/src/test/java/DP/EnvelopsTest.java
@@ -0,0 +1,4 @@
+package DP;
+
+public class EnvelopsTest {
+}
diff --git a/algorithm/src/test/java/DP/IsSubsequenceTest.java b/algorithm/src/test/java/DP/IsSubsequenceTest.java
new file mode 100644
index 0000000..bd8bd88
--- /dev/null
+++ b/algorithm/src/test/java/DP/IsSubsequenceTest.java
@@ -0,0 +1,25 @@
+package DP;
+
+import org.junit.Test;
+
+public class IsSubsequenceTest {
+ IsSubsequence solver = new IsSubsequence();
+
+ @Test
+ public void testOne(){
+ String s = "abc";
+ String t = "ahbgdc";
+ boolean res = solver.isSubsequence(s, t);
+ System.out.println(res);
+ // true
+ }
+
+ @Test
+ public void testTwo(){
+ String s = "axc";
+ String t = "ahbgdc";
+ boolean res = solver.isSubsequence(s, t);
+ System.out.println(res);
+ // false
+ }
+}
diff --git a/algorithm/src/test/java/DP/LongestCommonSubsequenceIITest.java b/algorithm/src/test/java/DP/LongestCommonSubsequenceIITest.java
new file mode 100644
index 0000000..7894735
--- /dev/null
+++ b/algorithm/src/test/java/DP/LongestCommonSubsequenceIITest.java
@@ -0,0 +1,35 @@
+package DP;
+
+import org.junit.Test;
+
+public class LongestCommonSubsequenceIITest {
+
+ LongestCommonSubsequenceII solver = new LongestCommonSubsequenceII();
+
+ @Test
+ public void testOne(){
+ String text1 = "abcde";
+ String text2 = "ace";
+ int res = solver.longestCommonSubsequence(text1, text2);
+ System.out.println(res);
+ // 3
+ }
+
+ @Test
+ public void testTwo(){
+ String text1 = "abc";
+ String text2 = "abc";
+ int res = solver.longestCommonSubsequence(text1, text2);
+ System.out.println(res);
+ // 3
+ }
+
+ @Test
+ public void testThree(){
+ String text1 = "abc";
+ String text2 = "def";
+ int res = solver.longestCommonSubsequence(text1, text2);
+ System.out.println(res);
+ // 0
+ }
+}
diff --git a/algorithm/src/test/java/DP/LongestCommonSubsequenceTest.java b/algorithm/src/test/java/DP/LongestCommonSubsequenceTest.java
new file mode 100644
index 0000000..b6db982
--- /dev/null
+++ b/algorithm/src/test/java/DP/LongestCommonSubsequenceTest.java
@@ -0,0 +1,35 @@
+package DP;
+
+import org.junit.Test;
+
+public class LongestCommonSubsequenceTest {
+
+ LongestCommonSubsequence solver = new LongestCommonSubsequence();
+
+ @Test
+ public void testOne(){
+ String text1 = "abcde";
+ String text2 = "ace";
+ int res = solver.longestCommonSubsequence(text1, text2);
+ System.out.println(res);
+ // 3
+ }
+
+ @Test
+ public void testTwo(){
+ String text1 = "abc";
+ String text2 = "abc";
+ int res = solver.longestCommonSubsequence(text1, text2);
+ System.out.println(res);
+ // 3
+ }
+
+ @Test
+ public void testThree(){
+ String text1 = "abc";
+ String text2 = "def";
+ int res = solver.longestCommonSubsequence(text1, text2);
+ System.out.println(res);
+ // 0
+ }
+}
diff --git a/algorithm/src/test/java/DP/MinFallingPathSum2Test.java b/algorithm/src/test/java/DP/MinFallingPathSum2Test.java
new file mode 100644
index 0000000..f068b27
--- /dev/null
+++ b/algorithm/src/test/java/DP/MinFallingPathSum2Test.java
@@ -0,0 +1,42 @@
+package DP;
+
+import org.junit.Test;
+
+public class MinFallingPathSum2Test {
+ MinFallingPathSum2 solver = new MinFallingPathSum2();
+
+ @Test
+ public void testOne() {
+ int[][] grid = {
+ {1,2,3},
+ {4,5,6},
+ {7,8,9}
+ };
+ int res = solver.minFallingPathSum(grid);
+ System.out.println(res);
+ // 13
+ }
+
+ @Test
+ public void testTwo() {
+ int[][] grid = {{7}};
+ int res = solver.minFallingPathSum(grid);
+ System.out.println(res);
+ // 7
+ }
+
+ @Test
+ public void testThree() {
+ int[][] grid = {
+ {-73,61,43,-48,-36},
+ {3,30,27,57,10},
+ {96,-76,84,59,-15},
+ {5,-49,76,31,-7},
+ {97,91,61,-46,67}
+ };
+ int res = solver.minFallingPathSum(grid);
+ System.out.println(res);
+ // -192
+
+ }
+}
diff --git a/algorithm/src/test/java/DP/MinFallingPathSumIITest.java b/algorithm/src/test/java/DP/MinFallingPathSumIITest.java
new file mode 100644
index 0000000..6d42bfe
--- /dev/null
+++ b/algorithm/src/test/java/DP/MinFallingPathSumIITest.java
@@ -0,0 +1,39 @@
+package DP;
+
+import org.junit.Test;
+
+public class MinFallingPathSumIITest {
+ MinFallingPathSumII solver = new MinFallingPathSumII();
+
+ @Test
+ public void testOne() {
+ int[][] matrix = {{2,1,3},{6,5,4},{7,8,9}};
+ int res = solver.minFallingPathSum(matrix);
+ System.out.println(res);
+ // 13
+ }
+
+ @Test
+ public void testTwo() {
+ int[][] matrix = {{-19,57},{-40,-5}};
+ int res = solver.minFallingPathSum(matrix);
+ System.out.println(res);
+ // -59
+ }
+
+ @Test
+ public void testThree() {
+ int[][] matrix = {{-48}};
+ int res = solver.minFallingPathSum(matrix);
+ System.out.println(res);
+ // -48
+ }
+
+ @Test
+ public void testFour() {
+ int[][] matrix = {{100,-42,-46,-41},{31,97,10,-10},{-58,-51,82,89},{51,81,69,-51}};
+ int res = solver.minFallingPathSum(matrix);
+ System.out.println(res);
+ // -48
+ }
+}
diff --git a/algorithm/src/test/java/DP/MinFallingPathSumTest.java b/algorithm/src/test/java/DP/MinFallingPathSumTest.java
new file mode 100644
index 0000000..5ded69c
--- /dev/null
+++ b/algorithm/src/test/java/DP/MinFallingPathSumTest.java
@@ -0,0 +1,41 @@
+package DP;
+
+import org.junit.Test;
+
+import java.util.Arrays;
+
+public class MinFallingPathSumTest {
+ MinFallingPathSum solver = new MinFallingPathSum();
+
+ @Test
+ public void testOne() {
+ int[][] matrix = {{2,1,3},{6,5,4},{7,8,9}};
+ int res = solver.minFallingPathSum(matrix);
+ System.out.println(res);
+ // 13
+ }
+
+ @Test
+ public void testTwo() {
+ int[][] matrix = {{-19,57},{-40,-5}};
+ int res = solver.minFallingPathSum(matrix);
+ System.out.println(res);
+ // -59
+ }
+
+ @Test
+ public void testThree() {
+ int[][] matrix = {{-48}};
+ int res = solver.minFallingPathSum(matrix);
+ System.out.println(res);
+ // -48
+ }
+
+ @Test
+ public void testFour() {
+ int[][] matrix = {{100,-42,-46,-41},{31,97,10,-10},{-58,-51,82,89},{51,81,69,-51}};
+ int res = solver.minFallingPathSum(matrix);
+ System.out.println(res);
+ // -48
+ }
+}
diff --git a/algorithm/src/test/java/DP/MinPathSumTest.java b/algorithm/src/test/java/DP/MinPathSumTest.java
new file mode 100644
index 0000000..583728c
--- /dev/null
+++ b/algorithm/src/test/java/DP/MinPathSumTest.java
@@ -0,0 +1,35 @@
+package DP;
+
+import org.junit.Test;
+
+public class MinPathSumTest {
+
+ MinPathSum solver = new MinPathSum();
+
+ @Test
+ public void testOne(){
+ int[][] grid = new int[][]{
+ {1,3,1},
+ {1,5,1},
+ {4,2,1}
+ };
+
+ int res = solver.minPathSum(grid);
+ System.out.println(res);
+ // 7
+ }
+
+ @Test
+ public void testTwo(){
+ int[][] grid = new int[][]{
+ {1,2,3},
+ {4,5,6}
+ };
+
+ int res = solver.minPathSum(grid);
+ System.out.println(res);
+ // 12
+ }
+
+
+}
diff --git a/algorithm/src/test/java/DP/MinimumTriangleTotalIITest.java b/algorithm/src/test/java/DP/MinimumTriangleTotalIITest.java
new file mode 100644
index 0000000..136873b
--- /dev/null
+++ b/algorithm/src/test/java/DP/MinimumTriangleTotalIITest.java
@@ -0,0 +1,50 @@
+package DP;
+
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class MinimumTriangleTotalIITest {
+ MinimumTriangleTotalII solver = new MinimumTriangleTotalII();
+
+// @Test
+ public void test() {
+ int res = Integer.MIN_VALUE;
+ System.out.println(res+1);
+ // -2147483647
+ }
+
+ @Test
+ public void testOne(){
+ int[][] nums = {{2},{3,4},{6,5,7},{4,1,8,3}};
+ List> triangle = new ArrayList<>();
+ for(int i=0; i list = new ArrayList<>();
+ for(int j=0; j> triangle = new ArrayList<>();
+ for(int i=0; i list = new ArrayList<>();
+ for(int j=0; j> triangle = new ArrayList<>();
+ for(int i=0; i list = new ArrayList<>();
+ for(int j=0; j> triangle = new ArrayList<>();
+ for(int i=0; i list = new ArrayList<>();
+ for(int j=0; j> res = solver.intervalListIntersections(firstList, secondList);
+ for(ArrayList t: res) {
+ System.out.println(t);
+ /**
+ * [1, 2]
+ * [5, 5]
+ * [8, 10]
+ * [15, 23]
+ * [24, 24]
+ * [25, 25]
+ */
+ }
+
+ }
+}
diff --git a/algorithm/src/test/java/array/other/MaxRepeatSubStringTest.java b/algorithm/src/test/java/array/other/MaxRepeatSubStringTest.java
new file mode 100644
index 0000000..03d0237
--- /dev/null
+++ b/algorithm/src/test/java/array/other/MaxRepeatSubStringTest.java
@@ -0,0 +1,15 @@
+package array.other;
+
+import org.junit.Test;
+
+public class MaxRepeatSubStringTest {
+ MaxRepeatSubString solver = new MaxRepeatSubString();
+
+ @Test
+ public void testOne() {
+ String sequence = "aaabaaaabaaabaaaabaaaabaaaabaaaaba";
+ String word = "aaaba";
+ int res = solver.maxRepeating(sequence, word);
+ System.out.println(res);
+ }
+}
diff --git a/algorithm/src/test/java/array/other/RemoveDuplicateSortedArrayTest.java b/algorithm/src/test/java/array/other/RemoveDuplicateSortedArrayTest.java
new file mode 100644
index 0000000..e829157
--- /dev/null
+++ b/algorithm/src/test/java/array/other/RemoveDuplicateSortedArrayTest.java
@@ -0,0 +1,18 @@
+package array.other;
+
+import org.junit.Test;
+
+import java.util.Arrays;
+
+public class RemoveDuplicateSortedArrayTest {
+
+ RemoveDuplicateSortedArray solver = new RemoveDuplicateSortedArray();
+
+ @Test
+ public void testOne() {
+ int[] nums = new int[]{0,0,1,2,2,3,3,};
+ solver.removeDuplicateSortedArray(nums);
+ System.out.println(Arrays.toString(nums));
+ // [0, 1, 2, 3, 0, 0, 0]
+ }
+}
diff --git a/algorithm/src/test/java/array/other/Search2DMatrixIITest.java b/algorithm/src/test/java/array/other/Search2DMatrixIITest.java
new file mode 100644
index 0000000..81d83a9
--- /dev/null
+++ b/algorithm/src/test/java/array/other/Search2DMatrixIITest.java
@@ -0,0 +1,41 @@
+package array.other;
+
+import org.junit.Test;
+
+public class Search2DMatrixIITest {
+
+ Search2DMatrixII solver = new Search2DMatrixII();
+
+ @Test
+ public void testOne() {
+ int[][] nums = {
+ {1,4,7,11,15},
+ {2,5,8,12,19},
+ {3,6,9,16,22},
+ {10,13,14,17,24},
+ {18,21,23,26,30}
+ };
+ int target = 5;
+
+ boolean res = solver.search2DMatrixII(nums, target);
+ System.out.println(res);
+ // true
+ }
+
+ @Test
+ public void testTwo() {
+ int[][] nums = {
+ {1,4,7,11,15},
+ {2,5,8,12,19},
+ {3,6,9,16,22},
+ {10,13,14,17,24},
+ {18,21,23,26,30}
+ };
+ int target = 20;
+
+ boolean res = solver.search2DMatrixII(nums, target);
+ System.out.println(res);
+ // false
+ }
+
+}
diff --git a/algorithm/src/test/java/array/other/SquaresSortedArrayTest.java b/algorithm/src/test/java/array/other/SquaresSortedArrayTest.java
new file mode 100644
index 0000000..401618b
--- /dev/null
+++ b/algorithm/src/test/java/array/other/SquaresSortedArrayTest.java
@@ -0,0 +1,18 @@
+package array.other;
+
+import org.junit.Test;
+
+import java.util.Arrays;
+
+public class SquaresSortedArrayTest {
+
+ SquaresSortedArray solver = new SquaresSortedArray();
+
+ @Test
+ public void testOne() {
+ int[] nums = new int[]{-4, -1, 0, 3, 10};
+ int[] res = solver.squaresSortedArray(nums);
+ System.out.println(Arrays.toString(res));
+ // [0, 1, 9, 16, 100]
+ }
+}
diff --git a/algorithm/src/test/java/array/other/TrappingRainWaterTest.java b/algorithm/src/test/java/array/other/TrappingRainWaterTest.java
new file mode 100644
index 0000000..5ea8dd2
--- /dev/null
+++ b/algorithm/src/test/java/array/other/TrappingRainWaterTest.java
@@ -0,0 +1,24 @@
+package array.other;
+
+import org.junit.Test;
+
+public class TrappingRainWaterTest {
+
+ TrappingRainWater solver = new TrappingRainWater();
+
+ @Test
+ public void testOne() {
+ int[] nums = new int[] {0,1,0,2,1,0,1,3,2,1,2,1};
+ int res = solver.trappingRainWater(nums);
+ System.out.println(res);
+ // 6
+ }
+
+ @Test
+ public void testTwo() {
+ int[] nums = new int[] {4,2,0,3,2,5};
+ int res = solver.trappingRainWater(nums);
+ System.out.println(res);
+ // 9
+ }
+}
diff --git a/algorithm/src/test/java/array/other/TwoSumLessThanKTest.java b/algorithm/src/test/java/array/other/TwoSumLessThanKTest.java
new file mode 100644
index 0000000..359bca3
--- /dev/null
+++ b/algorithm/src/test/java/array/other/TwoSumLessThanKTest.java
@@ -0,0 +1,26 @@
+package array.other;
+
+import org.junit.Test;
+
+public class TwoSumLessThanKTest {
+
+ TwoSumLessThanK solver = new TwoSumLessThanK();
+
+ @Test
+ public void testOne() {
+ int[] nums = new int[] {34,23,1,24,75,33,54,8};
+ int k = 60;
+ int res = solver.twoSumLessThanK(nums, k);
+ System.out.println(res);
+ // 58
+ }
+
+ @Test
+ public void testTwo() {
+ int[] nums = new int[] {10,20,30};
+ int k = 15;
+ int res = solver.twoSumLessThanK(nums, k);
+ System.out.println(res);
+ // -1
+ }
+}
diff --git a/algorithm/src/test/java/array/slideWIndow/FindAnagramsTest.java b/algorithm/src/test/java/array/slideWIndow/FindAnagramsTest.java
new file mode 100644
index 0000000..534da35
--- /dev/null
+++ b/algorithm/src/test/java/array/slideWIndow/FindAnagramsTest.java
@@ -0,0 +1,43 @@
+package array.slideWIndow;
+
+import org.junit.Assert;
+import org.junit.Test;
+import array.slideWindow.FindAnagrams;
+
+import java.util.List;
+
+public class FindAnagramsTest {
+
+ private FindAnagrams anagrams = new FindAnagrams();
+
+ @Test
+ public void findAnagrams1() {
+ String s = "cbaebabacd", p = "abc";
+ int[] expect = new int[] {0, 6};
+ List resArray = anagrams.findAnagrams(s, p);
+ int[] res = new int[resArray.size()];
+
+ for(int i=0;i