From 0bbbbd72384214c69fa35864b872955cbecca9eb Mon Sep 17 00:00:00 2001 From: yuanguangxin <274841922@qq.com> Date: Sat, 29 Feb 2020 18:10:43 +0800 Subject: [PATCH 01/19] add q138 --- .idea/workspace.xml | 48 ++++++++++++++++++++++----------------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 3ab00d5..47ff3f7 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -1,12 +1,7 @@ - - - - - - + @@ -81,7 +76,7 @@ - + - - @@ -280,6 +275,7 @@ + 1580045439607 @@ -678,25 +674,25 @@ - + - + - + - + - + - + - + - + @@ -718,10 +714,10 @@ - + - + @@ -730,6 +726,10 @@ + + + + From ece8cb1ae9962e7797da0942b487086b53ec63e5 Mon Sep 17 00:00:00 2001 From: yuanguangxin <274841922@qq.com> Date: Sat, 29 Feb 2020 18:25:55 +0800 Subject: [PATCH 02/19] add q215/q347 --- .idea/workspace.xml | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index e96687a..7eeca61 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -678,14 +678,14 @@ - + - - + + - + @@ -728,14 +728,18 @@ + + + + - + - + From 75f95ee6c50c7c23a499e150b4403996ce36870d Mon Sep 17 00:00:00 2001 From: yuanguangxin <274841922@qq.com> Date: Sat, 29 Feb 2020 18:27:41 +0800 Subject: [PATCH 03/19] add q215/q347 --- .idea/workspace.xml | 35 ++++++++++++++++++++++------------- README.md | 11 ++++++----- 2 files changed, 28 insertions(+), 18 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 7eeca61..2309a7c 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,13 +2,8 @@ - - - - - 1580045439607 @@ -585,7 +580,21 @@ - @@ -638,7 +647,6 @@ - @@ -663,7 +671,8 @@ - @@ -678,10 +687,10 @@ - + - + @@ -736,10 +745,10 @@ - + - + diff --git a/README.md b/README.md index a7c0f2a..68407bd 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,10 @@ * [q141_环形链表](/src/快慢指针遍历/q141_环形链表) * [q202_快乐数](/src/快慢指针遍历/q202_快乐数) +### 区间合并 + +* [q56_合并区间](/src/区间合并/q56_合并区间) + ### 字符串操作 * [q6_Z字形变换](/src/字符串操作/q6_Z字形变换) @@ -55,11 +59,8 @@ ### 堆相关 - - -### 区间合并 - -* [q56_合并区间](/src/区间合并/q56_合并区间) +* [q215_数组中的第K个最大元素](/src/堆相关/q215_数组中的第K个最大元素) +* [q347_前K个高频元素](/src/堆相关/q347_前K个高频元素) ### 递归 From 797687e5d63e35103affea84c8844b227d9450ac Mon Sep 17 00:00:00 2001 From: yuanguangxin <274841922@qq.com> Date: Fri, 6 Mar 2020 20:30:19 +0800 Subject: [PATCH 04/19] add q316 --- .idea/workspace.xml | 55 +++++++++++-------- README.md | 1 + .../q316_去除重复字母/Solution.java | 28 ++++++++++ 3 files changed, 62 insertions(+), 22 deletions(-) create mode 100644 src/栈相关/q316_去除重复字母/Solution.java diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 2309a7c..a9d754e 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -1,7 +1,8 @@ - + + @@ -79,7 +80,7 @@ - + - - @@ -277,7 +278,10 @@ - + + + + 1580045439607 @@ -594,7 +598,14 @@ - @@ -687,35 +698,35 @@ - + - + - + - + - + - + - + - + - + - + @@ -741,14 +752,14 @@ - + - - + + - + diff --git a/README.md b/README.md index 68407bd..4f03271 100644 --- a/README.md +++ b/README.md @@ -56,6 +56,7 @@ * [q20_有效的括号](/src/栈相关/q20_有效的括号) * [q224_基本计算器](/src/栈相关/q224_基本计算器) +* [q316_去除重复字母](/src/栈相关/q316_去除重复字母) ### 堆相关 diff --git a/src/栈相关/q316_去除重复字母/Solution.java b/src/栈相关/q316_去除重复字母/Solution.java new file mode 100644 index 0000000..53bc134 --- /dev/null +++ b/src/栈相关/q316_去除重复字母/Solution.java @@ -0,0 +1,28 @@ +package 栈相关.q316_去除重复字母; + +import java.util.Stack; + +/** + * 栈操作 o(n*log(n)) + */ +public class Solution { + + public String removeDuplicateLetters(String s) { + Stack stack = new Stack<>(); + for (int i = 0; i < s.length(); i++) { + Character c = s.charAt(i); + if (stack.contains(c)) { + continue; + } + while (!stack.isEmpty() && stack.peek() > c && s.indexOf(stack.peek(), i) != -1) { + stack.pop(); + } + stack.push(c); + } + String rs = ""; + for (int i = 0; i < stack.size(); i++) { + rs += stack.get(i); + } + return rs; + } +} From 31aca682c64b6f8a24c7f1dee2d738bdb9044ec0 Mon Sep 17 00:00:00 2001 From: yuanguangxin <274841922@qq.com> Date: Tue, 10 Mar 2020 22:51:19 +0800 Subject: [PATCH 05/19] add q226 --- .idea/workspace.xml | 31 ++++++++++++------- README.md | 1 + src/递归/q226_翻转二叉树/Solution.java | 23 ++++++++++++++ src/递归/q226_翻转二叉树/TreeNode.java | 11 +++++++ 4 files changed, 55 insertions(+), 11 deletions(-) create mode 100644 src/递归/q226_翻转二叉树/Solution.java create mode 100644 src/递归/q226_翻转二叉树/TreeNode.java diff --git a/.idea/workspace.xml b/.idea/workspace.xml index a9d754e..4f3f6d0 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -1,8 +1,9 @@ - - + + + @@ -67,11 +68,11 @@ + - @@ -281,7 +282,8 @@ - + + 1580045439607 @@ -605,7 +607,14 @@ - @@ -658,7 +667,6 @@ - @@ -683,7 +691,8 @@ - @@ -698,10 +707,10 @@ - + - + @@ -756,10 +765,10 @@ - + - + diff --git a/README.md b/README.md index 4f03271..987624d 100644 --- a/README.md +++ b/README.md @@ -67,6 +67,7 @@ * [q21_合并两个有序链表](/src/递归/q21_合并两个有序链表) * [q101_对称二叉树](/src/递归/q101_对称二叉树) +* [q226_翻转二叉树](/src/递归/q226_翻转二叉树) * [q236_二叉树的最近公共祖先](/src/递归/q236_二叉树的最近公共祖先) ### 分治法/二分法 diff --git a/src/递归/q226_翻转二叉树/Solution.java b/src/递归/q226_翻转二叉树/Solution.java new file mode 100644 index 0000000..2d17d88 --- /dev/null +++ b/src/递归/q226_翻转二叉树/Solution.java @@ -0,0 +1,23 @@ +package 递归.q226_翻转二叉树; + +/** + * 递归 o(n) + */ +public class Solution { + + public TreeNode invertTree(TreeNode root) { + if (root == null) { + return null; + } + TreeNode temp = root.left; + root.left = root.right; + root.right = temp; + if (root.left != null) { + invertTree(root.left); + } + if (root.right != null) { + invertTree(root.right); + } + return root; + } +} diff --git a/src/递归/q226_翻转二叉树/TreeNode.java b/src/递归/q226_翻转二叉树/TreeNode.java new file mode 100644 index 0000000..ac16744 --- /dev/null +++ b/src/递归/q226_翻转二叉树/TreeNode.java @@ -0,0 +1,11 @@ +package 递归.q226_翻转二叉树; + +public class TreeNode { + int val; + TreeNode left; + TreeNode right; + + TreeNode(int x) { + val = x; + } +} From 671d379295b65267827fdfd7a394e38d3db695f0 Mon Sep 17 00:00:00 2001 From: yuanguangxin <274841922@qq.com> Date: Mon, 16 Mar 2020 00:31:03 +0800 Subject: [PATCH 06/19] add q300 --- .idea/workspace.xml | 30 ++++++++++------ README.md | 1 + .../q300_最长上升子序列/Solution.java | 36 +++++++++++++++++++ 3 files changed, 56 insertions(+), 11 deletions(-) create mode 100644 src/动态规划/q300_最长上升子序列/Solution.java diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 4f3f6d0..ed8aae4 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -1,9 +1,8 @@ - - - + + @@ -283,7 +282,9 @@ - + + + 1580045439607 @@ -614,7 +615,14 @@ - @@ -667,7 +675,6 @@ - @@ -692,7 +699,8 @@ - @@ -707,10 +715,10 @@ - + - + @@ -765,10 +773,10 @@ - + - + diff --git a/README.md b/README.md index 987624d..34ccf4c 100644 --- a/README.md +++ b/README.md @@ -80,6 +80,7 @@ * [q5_最长回文子串](/src/动态规划/q5_最长回文子串) * [q53_最大子序和](/src/动态规划/q53_最大子序和) * [q118_杨辉三角](/src/动态规划/q118_杨辉三角) +* [q300_最长上升子序列](/src/动态规划/q300_最长上升子序列) * [q746_使用最小花费爬楼梯](/src/动态规划/q746_使用最小花费爬楼梯) * [q1277_统计全为1的正方形子矩阵](/src/动态规划/q1277_统计全为1的正方形子矩阵) diff --git a/src/动态规划/q300_最长上升子序列/Solution.java b/src/动态规划/q300_最长上升子序列/Solution.java new file mode 100644 index 0000000..4378551 --- /dev/null +++ b/src/动态规划/q300_最长上升子序列/Solution.java @@ -0,0 +1,36 @@ +package 动态规划.q300_最长上升子序列; + +/** + * 动态规划 dp[i]表示以i索引下标结束的最长上升子序列 o(n*log(n)) + */ +public class Solution { + + public int lengthOfLIS(int[] nums) { + if (nums == null || nums.length == 0) { + return 0; + } + + if (nums.length == 1) { + return 1; + } + + int n = nums.length; + int[] dp = new int[n]; + int rs = 0; + + for (int i = 0; i < n; i++) { + dp[i] = 1; + int max = 0; + for (int j = i - 1; j >= 0; j--) { + if (nums[j] < nums[i] && dp[j] > max) { + max = dp[j]; + } + } + dp[i] += max; + if (dp[i] > rs) { + rs = dp[i]; + } + } + return rs; + } +} From b3d192eaec0a64b1aa97a9d2948adaa3f4c2dec5 Mon Sep 17 00:00:00 2001 From: yuanguangxin <274841922@qq.com> Date: Tue, 17 Mar 2020 11:43:15 +0800 Subject: [PATCH 07/19] update Rocket.md --- .idea/workspace.xml | 25 +++++++++++++++---------- Rocket.md | 8 ++++++++ 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index ed8aae4..816062e 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,9 +2,7 @@ - - @@ -675,7 +680,6 @@ - @@ -700,7 +704,8 @@ - @@ -715,10 +720,10 @@ - + - + @@ -773,10 +778,10 @@ - + - + diff --git a/Rocket.md b/Rocket.md index be49abf..d151924 100644 --- a/Rocket.md +++ b/Rocket.md @@ -374,6 +374,14 @@ ThreadLoal 变量,线程局部变量,同一个 ThreadLocal 所包含的对 一个线程内可以存在多个 ThreadLocal 对象,所以其实是 ThreadLocal 内部维护了一个 Map ,这个 Map 不是直接使用的 HashMap ,而是 ThreadLocal 实现的一个叫做 ThreadLocalMap 的静态内部类。而我们使用的 get()、set() 方法其实都是调用了这个ThreadLocalMap类对应的 get()、set() 方法。 +### ThreadLocal为什么要使用弱引用和内存泄露问题 + +Map中的key为一个threadlocal实例. 这个Map的确使用了弱引用,不过弱引用只是针对key.每个key都弱引用指向threadlocal.假如每个key都强引用指向threadlocal,也就是上图虚线那里是个强引用,那么这个threadlocal就会因为和entry存在强引用无法被回收!造成内存泄漏 ,除非线程结束,线程被回收了,map也跟着回收。 + +虽然上述的弱引用解决了key,也就是线程的ThreadLocal能及时被回收,但是value却依然存在内存泄漏的问题。当把threadlocal实例置为null以后,没有任何强引用指向threadlocal实例,所以threadlocal将会被gc回收.map里面的value却没有被回收.而这块value永远不会被访问到了. 所以存在着内存泄露,因为存在一条从current thread连接过来的强引用.只有当前thread结束以后, current thread就不会存在栈中,强引用断开, Current Thread, Map, value将全部被GC回收.所以当线程的某个localThread使用完了,马上调用threadlocal的remove方法,就不会发生这种情况了。 + +另外其实只要这个线程对象及时被gc回收,这个内存泄露问题影响不大,但在threadLocal设为null到线程结束中间这段时间不会被回收的,就发生了我们认为的内存泄露。最要命的是线程对象不被回收的情况,这就发生了真正意义上的内存泄露。比如使用线程池的时候,线程结束是不会销毁的,会再次使用,就可能出现内存泄露。 + ### HashSet和HashMap HashSet的value存的是一个static finial PRESENT = newObject()。而HashSet的remove是使用HashMap实现,则是map.remove而map的移除会返回value,如果底层value都是存null,显然将无法分辨是否移除成功。 From 36a9be98bcbc47d6ee8e1a99e39035a2503f45b3 Mon Sep 17 00:00:00 2001 From: yuanguangxin <274841922@qq.com> Date: Mon, 23 Mar 2020 23:47:10 +0800 Subject: [PATCH 08/19] add q876 --- .idea/workspace.xml | 39 +++++++++++-------- README.md | 1 + .../q876_链表的中间结点/ListNode.java | 12 ++++++ .../q876_链表的中间结点/Solution.java | 16 ++++++++ 4 files changed, 51 insertions(+), 17 deletions(-) create mode 100644 src/快慢指针遍历/q876_链表的中间结点/ListNode.java create mode 100644 src/快慢指针遍历/q876_链表的中间结点/Solution.java diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 816062e..bbac213 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,7 +2,10 @@ + + + + - @@ -283,13 +286,8 @@ - - - 1580045439607 - 1580057171456 @@ -627,7 +625,14 @@ - @@ -691,7 +696,6 @@ - @@ -705,7 +709,8 @@ - @@ -720,14 +725,14 @@ - + - - + + - + @@ -778,10 +783,10 @@ - + - + diff --git a/README.md b/README.md index 34ccf4c..8a309c9 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,7 @@ * [q141_环形链表](/src/快慢指针遍历/q141_环形链表) * [q202_快乐数](/src/快慢指针遍历/q202_快乐数) +* [q876_链表的中间结点](/src/快慢指针遍历/q876_链表的中间结点) ### 区间合并 diff --git a/src/快慢指针遍历/q876_链表的中间结点/ListNode.java b/src/快慢指针遍历/q876_链表的中间结点/ListNode.java new file mode 100644 index 0000000..b49880a --- /dev/null +++ b/src/快慢指针遍历/q876_链表的中间结点/ListNode.java @@ -0,0 +1,12 @@ +package 快慢指针遍历.q876_链表的中间结点; + + +public class ListNode { + int val; + ListNode next; + + ListNode(int x) { + val = x; + } +} + diff --git a/src/快慢指针遍历/q876_链表的中间结点/Solution.java b/src/快慢指针遍历/q876_链表的中间结点/Solution.java new file mode 100644 index 0000000..395d326 --- /dev/null +++ b/src/快慢指针遍历/q876_链表的中间结点/Solution.java @@ -0,0 +1,16 @@ +package 快慢指针遍历.q876_链表的中间结点; + +/** + * 快慢指针法 o(n) + */ +public class Solution { + + public ListNode middleNode(ListNode head) { + ListNode slow = head, fast = head; + while (fast != null && fast.next != null) { + slow = slow.next; + fast = fast.next.next; + } + return slow; + } +} From 977865154a50b307f43bbf54f3b8f69b439f4e8f Mon Sep 17 00:00:00 2001 From: yuanguangxin <274841922@qq.com> Date: Tue, 24 Mar 2020 13:31:29 +0800 Subject: [PATCH 09/19] update Rocket.md --- .idea/workspace.xml | 8 ++++---- Rocket.md | 1 - 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index bbac213..9ff9c57 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -725,14 +725,14 @@ - + - - + + - + diff --git a/Rocket.md b/Rocket.md index d151924..07cb5db 100644 --- a/Rocket.md +++ b/Rocket.md @@ -601,7 +601,6 @@ TCP是一个双向通信协议,通信双方都有能力发送信息,并接 因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。 - ## 数据结构与算法 ### 排序算法 From 1991c8b37cb14419ef553b64a1831f9b78c59909 Mon Sep 17 00:00:00 2001 From: yuanguangxin <274841922@qq.com> Date: Tue, 24 Mar 2020 17:21:46 +0800 Subject: [PATCH 10/19] add q945 --- .idea/workspace.xml | 33 +++++++++++-------- README.md | 1 + .../Solution.java | 28 ++++++++++++++++ 3 files changed, 48 insertions(+), 14 deletions(-) create mode 100644 src/数组操作/q945_使数组唯一的最小增量/Solution.java diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 9ff9c57..5113939 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,8 +2,7 @@ - - + @@ -288,13 +287,8 @@ - - - 1580057171456 - 1580235186067 @@ -632,7 +626,14 @@ - @@ -725,10 +726,10 @@ - + - + @@ -783,10 +784,10 @@ - + - + @@ -795,6 +796,10 @@ + + + + diff --git a/README.md b/README.md index 8a309c9..7bbc887 100644 --- a/README.md +++ b/README.md @@ -52,6 +52,7 @@ * [q54_螺旋矩阵](/src/数组操作/q54_螺旋矩阵) * [q73_矩阵置零](/src/数组操作/q73_矩阵置零) +* [q945_使数组唯一的最小增量](/src/数组操作/q945_使数组唯一的最小增量) ### 栈相关 diff --git a/src/数组操作/q945_使数组唯一的最小增量/Solution.java b/src/数组操作/q945_使数组唯一的最小增量/Solution.java new file mode 100644 index 0000000..ec032d5 --- /dev/null +++ b/src/数组操作/q945_使数组唯一的最小增量/Solution.java @@ -0,0 +1,28 @@ +package 数组操作.q945_使数组唯一的最小增量; + +import java.util.Arrays; + +/** + * 先排序再遍历一次 o(n*log(n)) + */ +public class Solution { + + public int minIncrementForUnique(int[] A) { + if (A == null || A.length == 0 || A.length == 1) { + return 0; + } + + int rs = 0; + Arrays.sort(A); + + int t = A[0]; + for (int i = 1; i < A.length; i++) { + if (A[i] <= t) { + rs = rs + t - A[i] + 1; + A[i] = t + 1; + } + t = A[i]; + } + return rs; + } +} From 2b1138c66f645dd14534f4cac9e71c83179e6b18 Mon Sep 17 00:00:00 2001 From: yuanguangxin <274841922@qq.com> Date: Wed, 25 Mar 2020 11:57:02 +0800 Subject: [PATCH 11/19] add q70/q104 --- .idea/workspace.xml | 36 ++++++++++--------- README.md | 2 ++ src/动态规划/q70_爬楼梯/Solution.java | 20 +++++++++++ .../Solution.java | 17 +++++++++ .../TreeNode.java | 11 ++++++ 5 files changed, 69 insertions(+), 17 deletions(-) create mode 100644 src/动态规划/q70_爬楼梯/Solution.java create mode 100644 src/递归/q104_二叉树的最大深度/Solution.java create mode 100644 src/递归/q104_二叉树的最大深度/TreeNode.java diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 5113939..46b8313 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,7 +2,9 @@ - + + + @@ -67,11 +69,11 @@ + - @@ -288,14 +290,7 @@ - - - - 1580235186067 - 1580320003660 @@ -633,7 +628,14 @@ - @@ -686,7 +688,6 @@ - @@ -711,7 +712,8 @@ - @@ -726,10 +728,10 @@ - + - + @@ -784,10 +786,10 @@ - + - + diff --git a/README.md b/README.md index 7bbc887..79c53c7 100644 --- a/README.md +++ b/README.md @@ -69,6 +69,7 @@ * [q21_合并两个有序链表](/src/递归/q21_合并两个有序链表) * [q101_对称二叉树](/src/递归/q101_对称二叉树) +* [q104_二叉树的最大深度](/src/递归/q104_二叉树的最大深度) * [q226_翻转二叉树](/src/递归/q226_翻转二叉树) * [q236_二叉树的最近公共祖先](/src/递归/q236_二叉树的最近公共祖先) @@ -81,6 +82,7 @@ * [q5_最长回文子串](/src/动态规划/q5_最长回文子串) * [q53_最大子序和](/src/动态规划/q53_最大子序和) +* [q70_爬楼梯](/src/动态规划/q70_爬楼梯) * [q118_杨辉三角](/src/动态规划/q118_杨辉三角) * [q300_最长上升子序列](/src/动态规划/q300_最长上升子序列) * [q746_使用最小花费爬楼梯](/src/动态规划/q746_使用最小花费爬楼梯) diff --git a/src/动态规划/q70_爬楼梯/Solution.java b/src/动态规划/q70_爬楼梯/Solution.java new file mode 100644 index 0000000..528397b --- /dev/null +++ b/src/动态规划/q70_爬楼梯/Solution.java @@ -0,0 +1,20 @@ +package 动态规划.q70_爬楼梯; + +/** + * 动态规划 dp[i]表示到达第i阶的方法总数dp[i]=dp[i−1]+dp[i−2] o(n) + */ +public class Solution { + + public int climbStairs(int n) { + if (n == 1) { + return 1; + } + int[] dp = new int[n + 1]; + dp[1] = 1; + dp[2] = 2; + for (int i = 3; i <= n; i++) { + dp[i] = dp[i - 1] + dp[i - 2]; + } + return dp[n]; + } +} diff --git a/src/递归/q104_二叉树的最大深度/Solution.java b/src/递归/q104_二叉树的最大深度/Solution.java new file mode 100644 index 0000000..ff9949e --- /dev/null +++ b/src/递归/q104_二叉树的最大深度/Solution.java @@ -0,0 +1,17 @@ +package 递归.q104_二叉树的最大深度; + +/** + * 递归 o(n) + */ +public class Solution { + + public int maxDepth(TreeNode root) { + if (root == null) { + return 0; + } else { + int leftHeight = maxDepth(root.left); + int rightHeight = maxDepth(root.right); + return Math.max(leftHeight, rightHeight) + 1; + } + } +} diff --git a/src/递归/q104_二叉树的最大深度/TreeNode.java b/src/递归/q104_二叉树的最大深度/TreeNode.java new file mode 100644 index 0000000..ec216ba --- /dev/null +++ b/src/递归/q104_二叉树的最大深度/TreeNode.java @@ -0,0 +1,11 @@ +package 递归.q104_二叉树的最大深度; + +public class TreeNode { + int val; + TreeNode left; + TreeNode right; + + TreeNode(int x) { + val = x; + } +} From 962f808cf9436a9b7c357c8e8b809808f49a491a Mon Sep 17 00:00:00 2001 From: yuanguangxin <274841922@qq.com> Date: Thu, 26 Mar 2020 18:56:59 +0800 Subject: [PATCH 12/19] add q19 --- .idea/workspace.xml | 38 +++++++++---------- README.md | 1 + .../ListNode.java | 12 ++++++ .../Solution.java | 25 ++++++++++++ 4 files changed, 57 insertions(+), 19 deletions(-) create mode 100644 src/链表操作/q19_删除链表的倒数第N个节点/ListNode.java create mode 100644 src/链表操作/q19_删除链表的倒数第N个节点/Solution.java diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 46b8313..d5780ba 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,9 +2,8 @@ - - - + + @@ -69,11 +68,11 @@ + - @@ -290,14 +289,8 @@ - - - - 1580320003660 - 1580395653122 @@ -635,7 +628,14 @@ - @@ -688,7 +688,6 @@ - @@ -713,7 +712,8 @@ - @@ -728,10 +728,10 @@ - + - + @@ -786,10 +786,10 @@ - + - + diff --git a/README.md b/README.md index 79c53c7..f97f646 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,7 @@ ### 链表操作 * [q2_两数相加](/src/链表操作/q2_两数相加) +* [q19_删除链表的倒数第N个节点](/src/链表操作/q19_删除链表的倒数第N个节点) * [q138_复制带随机指针的链表](/src/链表操作/q138_复制带随机指针的链表) * [q206_反转链表](/src/链表操作/q206_反转链表) diff --git a/src/链表操作/q19_删除链表的倒数第N个节点/ListNode.java b/src/链表操作/q19_删除链表的倒数第N个节点/ListNode.java new file mode 100644 index 0000000..627c8d8 --- /dev/null +++ b/src/链表操作/q19_删除链表的倒数第N个节点/ListNode.java @@ -0,0 +1,12 @@ +package 链表操作.q19_删除链表的倒数第N个节点; + + +public class ListNode { + int val; + ListNode next; + + ListNode(int x) { + val = x; + } +} + diff --git a/src/链表操作/q19_删除链表的倒数第N个节点/Solution.java b/src/链表操作/q19_删除链表的倒数第N个节点/Solution.java new file mode 100644 index 0000000..c64e885 --- /dev/null +++ b/src/链表操作/q19_删除链表的倒数第N个节点/Solution.java @@ -0,0 +1,25 @@ +package 链表操作.q19_删除链表的倒数第N个节点; + +/** + * 利用两个指针 o(n) + */ +public class Solution { + + public ListNode removeNthFromEnd(ListNode head, int n) { + ListNode dummy = new ListNode(0); + dummy.next = head; + ListNode first = dummy; + ListNode second = dummy; + + for (int i = 1; i <= n + 1; i++) { + first = first.next; + } + + while (first != null) { + first = first.next; + second = second.next; + } + second.next = second.next.next; + return dummy.next; + } +} From f306cb33328aeae344accf4d6adf8dd059ca6294 Mon Sep 17 00:00:00 2001 From: yuanguangxin <274841922@qq.com> Date: Thu, 26 Mar 2020 20:38:12 +0800 Subject: [PATCH 13/19] add q32 --- .idea/workspace.xml | 79 ++++++++----------- README.md | 1 + .../q32_最长有效括号/Solution.java | 38 +++++++++ 3 files changed, 72 insertions(+), 46 deletions(-) create mode 100644 src/栈相关/q32_最长有效括号/Solution.java diff --git a/.idea/workspace.xml b/.idea/workspace.xml index d5780ba..3fb544b 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,8 +2,7 @@ - - + @@ -64,7 +63,7 @@ - + @@ -81,20 +80,7 @@ - - - + - - @@ -290,14 +276,8 @@ - - - - 1580395653122 - 1580409713059 @@ -635,7 +615,14 @@ - @@ -688,7 +675,6 @@ - @@ -713,7 +699,8 @@ - @@ -728,35 +715,35 @@ - + - + - + - + - + - + - + - + - + - + @@ -782,14 +769,14 @@ - + - - + + - + diff --git a/README.md b/README.md index f97f646..a80a1f7 100644 --- a/README.md +++ b/README.md @@ -58,6 +58,7 @@ ### 栈相关 * [q20_有效的括号](/src/栈相关/q20_有效的括号) +* [q32_最长有效括号](/src/栈相关/q32_最长有效括号) * [q224_基本计算器](/src/栈相关/q224_基本计算器) * [q316_去除重复字母](/src/栈相关/q316_去除重复字母) diff --git a/src/栈相关/q32_最长有效括号/Solution.java b/src/栈相关/q32_最长有效括号/Solution.java new file mode 100644 index 0000000..bd07506 --- /dev/null +++ b/src/栈相关/q32_最长有效括号/Solution.java @@ -0,0 +1,38 @@ +package 栈相关.q32_最长有效括号; + +import java.util.Stack; + +/** + * 利用索引栈 o(n) + */ +public class Solution { + + public int longestValidParentheses(String s) { + if (s == null || s.length() < 2) { + return 0; + } + + int maxLen = 0; + Stack stack = new Stack<>(); + stack.push(-1); + for (int i = 0; i < s.length(); i++) { + char temp = s.charAt(i); + if (temp == '(') { + stack.push(i); + } else { + stack.pop(); + if (stack.empty()) { + stack.push(i); + } else { + maxLen = Math.max(maxLen, i - stack.peek()); + } + } + } + + return maxLen; + } + + public static void main(String[] args) { + System.out.println(new Solution().longestValidParentheses(")()())")); + } +} From cded4a22b78674a8fee28b5c0363a743e44ccf56 Mon Sep 17 00:00:00 2001 From: yuanguangxin <274841922@qq.com> Date: Thu, 26 Mar 2020 21:48:04 +0800 Subject: [PATCH 14/19] add q34 --- .idea/workspace.xml | 95 ++++++++----------- README.md | 1 + .../Solution.java | 60 ++++++++++++ 3 files changed, 102 insertions(+), 54 deletions(-) create mode 100644 src/分治法/q34_在排序数组中查找元素的第一个和最后一个位置/Solution.java diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 3fb544b..73d0dc3 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,7 +2,7 @@ - + @@ -80,13 +80,13 @@ - - - @@ -675,7 +662,6 @@ - @@ -700,7 +686,8 @@ - @@ -715,55 +702,55 @@ - + - + - + - - - + + + - - - + + + - - - + + + - - - + + + - + - + - + - + - + - + - + @@ -773,10 +760,10 @@ - + - + diff --git a/README.md b/README.md index a80a1f7..3431465 100644 --- a/README.md +++ b/README.md @@ -79,6 +79,7 @@ * [q23_合并K个排序链表](/src/分治法/q23_合并K个排序链表) * [q33_搜索旋转排序数组](/src/分治法/q33_搜索旋转排序数组) +* [q34_在排序数组中查找元素的第一个和最后一个位置](/src/分治法/q34_在排序数组中查找元素的第一个和最后一个位置) ### 动态规划 diff --git a/src/分治法/q34_在排序数组中查找元素的第一个和最后一个位置/Solution.java b/src/分治法/q34_在排序数组中查找元素的第一个和最后一个位置/Solution.java new file mode 100644 index 0000000..daf19d6 --- /dev/null +++ b/src/分治法/q34_在排序数组中查找元素的第一个和最后一个位置/Solution.java @@ -0,0 +1,60 @@ +package 分治法.q34_在排序数组中查找元素的第一个和最后一个位置; + +/** + * 二分法 o(log(n)) + */ +public class Solution { + + public int[] searchRange(int[] nums, int target) { + if (nums == null || nums.length < 1) { + return new int[]{-1, -1}; + } + int midIndex = find(0, nums.length - 1, nums, target); + int[] rs = new int[2]; + rs[0] = midIndex; + rs[1] = midIndex; + if (midIndex == -1) { + return rs; + } + while (nums[rs[0]] == target && rs[0] > 0) { + int temp = find(0, rs[0] - 1, nums, target); + if (temp == -1) { + break; + } else { + rs[0] = temp; + } + } + + while (nums[rs[1]] == target && rs[1] < nums.length - 1) { + int temp = find(rs[1] + 1, nums.length - 1, nums, target); + if (temp == -1) { + break; + } else { + rs[1] = temp; + } + } + return rs; + } + + public int find(int beginIndex, int endIndex, int[] nums, int target) { + if (beginIndex == endIndex) { + if (nums[beginIndex] == target) { + return beginIndex; + } else { + return -1; + } + } + int mid = (endIndex - beginIndex) / 2 + beginIndex; + if (nums[mid] > target) { + return find(beginIndex, mid, nums, target); + } else if (nums[mid] < target) { + return find(mid + 1, endIndex, nums, target); + } else { + return mid; + } + } + + public static void main(String[] args) { + new Solution().searchRange(new int[]{2, 2}, 2); + } +} From 4bca22a75925700bba822ab8c51502bdafdd0e7d Mon Sep 17 00:00:00 2001 From: yuanguangxin <274841922@qq.com> Date: Thu, 26 Mar 2020 21:53:09 +0800 Subject: [PATCH 15/19] add q64 --- .idea/workspace.xml | 32 +++++++++---------- README.md | 1 + .../q64_最小路径和/Solution.java | 26 +++++++++++++++ 3 files changed, 43 insertions(+), 16 deletions(-) create mode 100644 src/动态规划/q64_最小路径和/Solution.java diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 73d0dc3..1720150 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,7 +2,7 @@ - + @@ -264,14 +264,7 @@ - - - - 1580496640692 - 1580585083883 @@ -609,7 +602,14 @@ - @@ -662,7 +662,6 @@ - @@ -687,7 +686,8 @@ - @@ -702,10 +702,10 @@ - + - + @@ -760,10 +760,10 @@ - + - + diff --git a/README.md b/README.md index 3431465..225f361 100644 --- a/README.md +++ b/README.md @@ -85,6 +85,7 @@ * [q5_最长回文子串](/src/动态规划/q5_最长回文子串) * [q53_最大子序和](/src/动态规划/q53_最大子序和) +* [q64_最小路径和](/src/动态规划/q64_最小路径和) * [q70_爬楼梯](/src/动态规划/q70_爬楼梯) * [q118_杨辉三角](/src/动态规划/q118_杨辉三角) * [q300_最长上升子序列](/src/动态规划/q300_最长上升子序列) diff --git a/src/动态规划/q64_最小路径和/Solution.java b/src/动态规划/q64_最小路径和/Solution.java new file mode 100644 index 0000000..8dd994b --- /dev/null +++ b/src/动态规划/q64_最小路径和/Solution.java @@ -0,0 +1,26 @@ +package 动态规划.q64_最小路径和; + +/** + * 动态规划 dp(j)=grid(i,j)+min(dp(j),dp(j+1)) o(m*n) + */ +public class Solution { + + public int minPathSum(int[][] grid) { + int[] dp = new int[grid[0].length]; + for (int i = grid.length - 1; i >= 0; i--) { + for (int j = grid[0].length - 1; j >= 0; j--) { + if (i == grid.length - 1 && j != grid[0].length - 1) { + dp[j] = grid[i][j] + dp[j + 1]; + } else if (j == grid[0].length - 1 && i != grid.length - 1) { + dp[j] = grid[i][j] + dp[j]; + } else if (j != grid[0].length - 1 && i != grid.length - 1) { + dp[j] = grid[i][j] + Math.min(dp[j], dp[j + 1]); + + } else { + dp[j] = grid[i][j]; + } + } + } + return dp[0]; + } +} From b6359959ac97689c4c01827a695b959862bf2fc4 Mon Sep 17 00:00:00 2001 From: yuanguangxin <274841922@qq.com> Date: Thu, 26 Mar 2020 22:23:36 +0800 Subject: [PATCH 16/19] add q155 --- .idea/workspace.xml | 66 +++++++++++----------- README.md | 1 + src/栈相关/q155_最小栈/MinStack.java | 43 ++++++++++++++ 3 files changed, 77 insertions(+), 33 deletions(-) create mode 100644 src/栈相关/q155_最小栈/MinStack.java diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 1720150..b71213d 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -1,8 +1,8 @@ - - + + @@ -80,13 +80,13 @@ - - - @@ -662,7 +662,6 @@ - @@ -687,7 +686,8 @@ - @@ -702,35 +702,35 @@ - + - + - + - + - + - + - + - + - + - + @@ -760,10 +760,10 @@ - + - + diff --git a/README.md b/README.md index 225f361..846f3a2 100644 --- a/README.md +++ b/README.md @@ -59,6 +59,7 @@ * [q20_有效的括号](/src/栈相关/q20_有效的括号) * [q32_最长有效括号](/src/栈相关/q32_最长有效括号) +* [q155_最小栈](/src/栈相关/q155_最小栈) * [q224_基本计算器](/src/栈相关/q224_基本计算器) * [q316_去除重复字母](/src/栈相关/q316_去除重复字母) diff --git a/src/栈相关/q155_最小栈/MinStack.java b/src/栈相关/q155_最小栈/MinStack.java new file mode 100644 index 0000000..a477396 --- /dev/null +++ b/src/栈相关/q155_最小栈/MinStack.java @@ -0,0 +1,43 @@ +package 栈相关.q155_最小栈; + +import java.util.Stack; + +/** + * 不使用辅助栈,每次push两个元素 + */ +public class MinStack { + + private Stack stack; + + public MinStack() { + stack = new Stack<>(); + } + + public void push(int x) { + if (stack.isEmpty()) { + stack.push(x); + stack.push(x); + } else { + int tmp = stack.peek(); + stack.push(x); + if (tmp < x) { + stack.push(tmp); + } else { + stack.push(x); + } + } + } + + public void pop() { + stack.pop(); + stack.pop(); + } + + public int top() { + return stack.get(stack.size() - 2); + } + + public int getMin() { + return stack.peek(); + } +} From 36d008734766673b767d8dccc55db18e4da04cdd Mon Sep 17 00:00:00 2001 From: yuanguangxin <274841922@qq.com> Date: Thu, 26 Mar 2020 22:49:55 +0800 Subject: [PATCH 17/19] add q61 --- .idea/workspace.xml | 61 ++++++++++--------- README.md | 1 + .../q61_旋转链表/ListNode.java | 10 +++ .../q61_旋转链表/Solution.java | 31 ++++++++++ 4 files changed, 73 insertions(+), 30 deletions(-) create mode 100644 src/链表操作/q61_旋转链表/ListNode.java create mode 100644 src/链表操作/q61_旋转链表/Solution.java diff --git a/.idea/workspace.xml b/.idea/workspace.xml index b71213d..248e887 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -1,8 +1,9 @@ - - + + + @@ -67,11 +68,11 @@ + - @@ -264,14 +265,7 @@ - - - - 1580714190854 - 1580753759299 @@ -609,7 +603,14 @@ - @@ -662,7 +663,6 @@ - @@ -687,7 +687,8 @@ - @@ -702,35 +703,35 @@ - + - - - + + + - + - - + + - + - + - + - + - + - + - + @@ -760,10 +761,10 @@ - + - + diff --git a/README.md b/README.md index 846f3a2..079abf6 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@ * [q2_两数相加](/src/链表操作/q2_两数相加) * [q19_删除链表的倒数第N个节点](/src/链表操作/q19_删除链表的倒数第N个节点) +* [q61_旋转链表](/src/链表操作/q61_旋转链表) * [q138_复制带随机指针的链表](/src/链表操作/q138_复制带随机指针的链表) * [q206_反转链表](/src/链表操作/q206_反转链表) diff --git a/src/链表操作/q61_旋转链表/ListNode.java b/src/链表操作/q61_旋转链表/ListNode.java new file mode 100644 index 0000000..2254184 --- /dev/null +++ b/src/链表操作/q61_旋转链表/ListNode.java @@ -0,0 +1,10 @@ +package 链表操作.q61_旋转链表; + +public class ListNode { + int val; + ListNode next; + + ListNode(int x) { + val = x; + } +} diff --git a/src/链表操作/q61_旋转链表/Solution.java b/src/链表操作/q61_旋转链表/Solution.java new file mode 100644 index 0000000..f417124 --- /dev/null +++ b/src/链表操作/q61_旋转链表/Solution.java @@ -0,0 +1,31 @@ +package 链表操作.q61_旋转链表; + +/** + * 先连接成环再找断点 o(n) + */ +public class Solution { + + public ListNode rotateRight(ListNode head, int k) { + if (head == null) { + return null; + } + if (head.next == null) { + return head; + } + + ListNode oldTail = head; + int n; + for (n = 1; oldTail.next != null; n++) { + oldTail = oldTail.next; + } + oldTail.next = head; + ListNode newTail = head; + for (int i = 0; i < n - k % n - 1; i++) { + newTail = newTail.next; + } + ListNode newHead = newTail.next; + newTail.next = null; + + return newHead; + } +} From d94836dfb224d6540d7628a88e8de31911764d5d Mon Sep 17 00:00:00 2001 From: yuanguangxin <274841922@qq.com> Date: Thu, 26 Mar 2020 23:02:17 +0800 Subject: [PATCH 18/19] sth ignore --- .idea/workspace.xml | 33 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 248e887..b2f54cc 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,10 +2,7 @@ - - - @@ -663,7 +660,6 @@ - @@ -688,7 +684,8 @@ - @@ -703,10 +700,10 @@ - + - + @@ -761,10 +758,10 @@ - + - + From 522f0c76d84a67c16a305a2bb74fd823e5e66f4f Mon Sep 17 00:00:00 2001 From: yuanguangxin <274841922@qq.com> Date: Thu, 26 Mar 2020 23:04:31 +0800 Subject: [PATCH 19/19] sth ignore --- .idea/workspace.xml | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index b2f54cc..1cb8d1c 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -262,7 +262,7 @@ - + 1580965798400 @@ -700,55 +700,55 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -758,10 +758,10 @@ - + - +