+ * 思维全过程记录方案:
+ * 1 背基础结构和算法 | 记录在课程笔记
+ * 2 看题 -> 悟题 思考过程 | 记录在wiki
+ * 3 悟题 -> 写题 实现难点 | 记录在代码注解
+ * 4 写题 -> 优化 多种解法 | 记录在leetcode提交 + *
+ * 问题: + * Given n non-negative integers representing an elevation map + * where the width of each bar is 1, + * compute how much water it is able to trap after raining. + *
+ * 题解方案topics: + * array、双指针、stack + * + * @author li tong + * @date 2019/6/3 10:18 + * @see Object + * @since 1.0 + */ +public class LeetCode_42_025 { + + public static void main(String[] args) { + int[] testcase = new int[]{2, 0, 2}; // 0, 2, 0 + System.out.println("FORCE=" + bruteForce(testcase)); + System.out.println(); + System.out.println("DP_ONE=" + dpOne(testcase)); + System.out.println(); + System.out.println("DP_TWO=" + dpTwo(testcase)); + System.out.println(); + System.out.println("STACK=" + stack(testcase)); + } + + /** + * 解法1 暴力求解
+ * + * @param columns + * @return + */ + public static int bruteForce(int[] columns) { + int result = 0, length = columns.length; + for (int i = 0; i < length; i++) { + int maxl = 0, maxr = 0; + for (int j = i; j < length; j++) { + maxr = Math.max(maxr, columns[j]); + } + for (int j = i; j >= 0; j--) { + maxl = Math.max(maxl, columns[j]); + } + result += Math.min(maxl, maxr) - columns[i]; + } + return result; + } + + /** + * 解法2 DP求解
+ * + * @param columns + * @return + */ + public static int dpOne(int[] columns) { + if (columns.length == 0) { + return 0; + } + int result = 0, length = columns.length; + int[] maxl = new int[columns.length]; + int[] maxr = new int[columns.length]; + maxl[0] = columns[0]; + maxr[length - 1] = columns[length - 1]; + for (int i = 1; i < length; i++) { + maxl[i] = Math.max(maxl[i - 1], columns[i]); + } + for (int i = length - 2; i >= 0; i--) { + maxr[i] = Math.max(maxr[i + 1], columns[i]); + } + for (int i = 1; i < columns.length - 1; i++) { + result += Math.min(maxl[i], maxr[i]) - columns[i]; + } + return result; + } + + /** + * 解法3 DP求解 单次遍历
+ * + * @param columns + * @return + */ + public static int dpTwo(int[] columns) { + int result = 0, left = 0, right = columns.length - 1; + int maxl = 0, maxr = 0; + while (left < right) { + if (columns[left] < columns[right]) { + if (columns[left] >= maxl) { + maxl = columns[left]; + } else { + result += (maxl - columns[left]); + } + ++left; + } else { + if (columns[right] >= maxr) { + maxr = columns[right]; + } else { + result += (maxr - columns[right]); + } + --right; + } + } + return result; + } + + /** + * 解法4 栈解法
+ *
+ * @param columns
+ * @return
+ */
+ public static int stack(int[] columns) {
+ int result = 0, cursor = 0, length = columns.length;
+ Stack
+ * 思维全过程记录方案:
+ * 1 背基础结构和算法 | 记录在课程笔记
+ * 2 看题 -> 悟题 思考过程 | 记录在wiki
+ * 3 悟题 -> 写题 实现难点 | 记录在代码注解
+ * 4 写题 -> 优化 多种解法 | 记录在leetcode提交
+ *
+ * 问题:
+ * A robot is located at the top-left corner of a m x n grid
+ * (marked 'Start' in the diagram below).
+ * The robot can only move either down or right at any point in time.
+ * The robot is trying to reach the bottom-right corner of the grid
+ * (marked 'Finish' in the diagram below).
+ * How many possible unique paths are there?
+ *
+ * 题解方案topics:
+ * array、dp
+ *
+ * @author li tong
+ * @date 2019/6/4 11:36
+ * @see Object
+ * @since 1.0
+ */
+public class LeetCode_62_025 {
+
+ /**
+ * 观察时间复杂度
+ */
+ private static int count = 0;
+
+ public static void main(String[] args) {
+ System.out.println(recursive(0, 0));
+ System.out.println(recursive(1, 1));
+ System.out.println(recursive(1, 2));
+ System.out.println(recursive(2, 2));
+ System.out.println(recursive(3, 2));
+ System.out.println(recursive(3, 3));
+ System.out.println("RECURSIVE=" + recursive(10, 10));
+ System.out.println();
+
+ System.out.println("RECURSIVE_MEM=" + recursiveMem(10, 10, new int[11][11]));
+ System.out.println();
+
+ System.out.println("TRY_DP_ONE=" + tryDPOne(10, 10));
+ System.out.println();
+
+ System.out.println("[LC PASS]DP_ONE=" + dpOne(51, 9));
+ System.out.println();
+
+ System.out.println("[LC PASS]DP_TWO=" + dpTwo(10, 10));
+ System.out.println();
+
+ System.out.println("[LC PASS]MATH=" + math(23, 12));
+ System.out.println("Count=" + count);
+ }
+
+ /**
+ * 解法1 递归
+ *
+ * @param m 棋盘长度
+ * @param n 棋盘高度
+ * @return
+ */
+ public static int recursive(int m, int n) {
+ count++;
+ if (m < 1 || n < 1) {
+ return 0;
+ } else if (m == 1 || n == 1) {
+ return 1;
+ }
+ return recursive(m - 1, n) + recursive(m, n - 1);
+ }
+
+ /**
+ * 解法2 缓存递归
+ *
+ * @param m
+ * @param n
+ * @param mem
+ * @return
+ */
+ public static int recursiveMem(int m, int n, int[][] mem) {
+ count++;
+ if (m < 1 || n < 1) {
+ return 0;
+ } else if (m == 1 || n == 1) {
+ return 1;
+ } else if (mem[m][n] == 0) {
+ mem[m][n] = recursiveMem(m - 1, n, mem) + recursiveMem(m, n - 1, mem);
+ }
+ return mem[m][n];
+ }
+
+ /**
+ * 解法3 DP
+ *
+ * @param m
+ * @param n
+ * @return
+ */
+ public static int dpOne(int m, int n) {
+ count++;
+ if (m == 0 || n == 0) {
+ return 0;
+ }
+ if (m == 1 || n == 1) {
+ return 1;
+ }
+ int[][] dp = new int[m + 1][n + 1];
+ for (int i = 0; i < m; i++) {
+ for (int j = 0; j < n; j++) {
+ if (i == 0 || j == 0) {
+ dp[i][j] = 1;
+ } else {
+ dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
+ }
+ }
+ }
+ return dp[m - 1][n - 1];
+ }
+
+ /**
+ * 解法4 DP优化
+ *
+ * @param m
+ * @param n
+ * @return
+ */
+ public static int dpTwo(int m, int n) {
+ count++;
+ if (m == 0 || n == 0) {
+ return 0;
+ }
+ if (m == 1 || n == 1) {
+ return 1;
+ }
+ int[] dp = new int[n];
+ for (int i = 0; i < m; i++) {
+ for (int j = 0; j < n; j++) {
+ if (i == 0 || j == 0) {
+ dp[j] = 1;
+ } else {
+ dp[j] += dp[j - 1];
+ }
+ }
+ }
+ return dp[n - 1];
+ }
+
+ /**
+ * 解法5 数学解法
+ *
+ * 公式 C(4, 3) = A(4,3)/ A(3,3) = 4*3*2 / 3*2*1 = 4
+ * 证明 abcd => abc abd acd bcd
+ * 公式 C(4, 2) = 4 * 3 / 2 = 6
+ * 证明 abcd => ab ac ad bc bd cd
+ *
+ * 证明 C5,3 = C5,5-3 = C5,2
+ * abcde
+ * C53 = abc abd abe acd ace ade + C43 = 10
+ * C52 = 5*4/2 = 10
+ *
+ * n > k
+ * C(n, k) = A(n,k) / A(k,k) = C(n, n-k) = A(n,n-k) / A(n-k,n-k)
+ * C52 = 5 * 4 / 2! = C53 = 5 * 4 * 3 / 3!
+ * = (n * n-1 * n-2 ... * n - k + 1) / k!
+ *
+ * @param m
+ * @param n
+ * @return
+ */
+ public static int math(int m, int n) {
+ // 总步数
+ int t = n + m - 2;
+ // 单单往下(或往右)的步数
+ int k = m - 1;
+ double res = 1;
+ for (int i = 1; i <= k; i++) {
+ res = res * (t - k + i) / i;
+ }
+ return (int)res;
+ }
+
+}
diff --git a/Week_01/id_25/NOTE.md b/Week_01/id_25/NOTE.md
index 107ea7d6..99bd1253 100644
--- a/Week_01/id_25/NOTE.md
+++ b/Week_01/id_25/NOTE.md
@@ -1 +1,77 @@
# 学习笔记
+1 对学习方法的总结
+ 观察了其他组的同学和我们组的做法
+ 感觉我们组的方法还是比较科学的:我们自己建立了一套题库,并且组内优先review。
+
+2 自己学习态度的变化
+ 平时在休息或思考时,分配了更多的精力思考算法问题
+
+3 具体的算法学习思维
+ 3.1 抓主干
+ 3.2 总结规律 自己五分钟无解的 就先看答案
+ 我也把这一过程写在了每个题目的注解里面
+ * 思维全过程记录方案:
+ * 1 背基础结构和算法 | 记录在课程笔记
+ * 2 看题 -> 悟题 思考过程 | 记录在wiki
+ * 3 悟题 -> 写题 实现难点 | 记录在代码注解
+ * 4 写题 -> 优化 多种解法 | 记录在leetcode提交
+ 3.3 反复练习
+ 有思路的就不断优化 没思路的 就先背诵 然后理解 再默写 如此往复
+ 根据这个套路 我制定了一份基于斐波那契遗忘曲线的复习表
+ 一定不要忘记老师说的 五毒神掌
+ 
+
+4 在学习笔记里 主要提及宏观上的学习领悟
+ 关于具体的题解思路 都详尽的写在题目里的注解里了
+
+5 分享一下记忆曲线复习表 即是TaskView.html
+ 直接浏览器打开就能用 里面包含一段斐波那契递归函数呦
+
+6 Review
+ 总体感触 用什么语言的都有 精彩纷呈
+ 5.1 LeetCode_242_18.java
+ 优点
+ 1. 和我写题的方式很像,把每一种解法都写出来了,也就是一个类里面,有多个解法,尽可能的涵盖了各种角度
+ 缺点
+ 1. 没有注解
+ 尽管老师说要少些注解,但是由于我们是在练习、学习,必要的地方还是要加上注解,一个是给自己记忆,另一方面方便别的同学阅读,
+ 另外,即使方法体、代码段里没有注解,在方法签名上也应有详细的doc和注解,阐述题意、解法、思路。
+
+ 5.2 LeetCode_26_015.py
+ 优点
+ 1. 看了这个同学的readme,说自己不是科班,罗列了很多的学到的知识点,可以看出非常认真。
+ 缺点
+ 1. 同上,代码缺少必要的注解和说明
+ 2. 解法偏少,只有一种解法。建议:除了自己思考的解法以外,也把其他解法实现一遍。
+
+ 5.3 LeetCode_021_29.go
+ 优点
+ 1. 这个同学做了很多题。
+ 2. 代码格式整齐 清爽 有适当的注解
+ 3. 脑图画的很好
+ 缺点
+ 1. 没有题解doc
+
+ 5.4 LeetCode_1047_022.js
+ 优点
+ 1. 代码格式整齐 清爽
+ 2. 脑图画的很好
+ 缺点
+ 1. 解法偏少
+ 2. 没有题解doc
+
+ 5.5 Leetcode_189_8.java
+ * 最喜欢的是这个同学的提交
+ 优点
+ 1. readme里面分门别类,格式整齐、详细的介绍了题目、难点分析、解题思路、参考代码
+ 2. 脑图画的很好
+ 缺点
+ 1. 部分代码没有格式化
+ 举例:
+ 1. k%nums.length,符号和变量中间要有空格,改为k % nums.length
+ 2. nums[i+k],改为 nums[i + k]
+ 3. for (int i=0; i
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Week_01/id_26/LeetCode_101_26.py b/Week_01/id_26/LeetCode_101_26.py
new file mode 100644
index 00000000..9ee2d4a7
--- /dev/null
+++ b/Week_01/id_26/LeetCode_101_26.py
@@ -0,0 +1,26 @@
+# Definition for a binary tree node.
+class TreeNode(object):
+ def __init__(self, x):
+ self.val = x
+ self.left = None
+ self.right = None
+
+
+class Solution(object):
+ def isSymmetric(self, root):
+ """
+ :type root: TreeNode
+ :rtype: bool
+ """
+
+ def _isSymmetric(node1, node2):
+ if not node1 and not node2:
+ return True
+ if not node1 or not node2:
+ return False
+ if not node1.val == node2.val:
+ return False
+ return _isSymmetric(node1.left, node2.right) and _isSymmetric(
+ node1.right, node2.left)
+
+ return _isSymmetric(root, root)
diff --git a/Week_01/id_26/LeetCode_1021_26.py b/Week_01/id_26/LeetCode_1021_26.py
new file mode 100644
index 00000000..e5cca86c
--- /dev/null
+++ b/Week_01/id_26/LeetCode_1021_26.py
@@ -0,0 +1,23 @@
+class Solution(object):
+ def removeOuterParentheses(self, S):
+ """
+ :type S: str
+ :rtype: str
+ """
+ if not S:
+ return S
+ ret, t = '', 0
+ for i in S:
+ if i == '(':
+ t += 1
+ if t > 1:
+ ret += i
+ if i == ')':
+ t -= 1
+ if t > 0:
+ ret += i
+ return ret
+
+
+print Solution().removeDuplicates('(()())(())')
+print Solution().removeDuplicates('(()())(())(()(()))')
diff --git a/Week_01/id_26/LeetCode_1047_26.py b/Week_01/id_26/LeetCode_1047_26.py
new file mode 100644
index 00000000..ec59a47a
--- /dev/null
+++ b/Week_01/id_26/LeetCode_1047_26.py
@@ -0,0 +1,21 @@
+class Solution(object):
+ def removeDuplicates(self, S):
+ """
+ :type S: str
+ :rtype: str
+ """
+ if not S:
+ return S
+ stack = []
+ for i in S:
+ if not stack:
+ stack.append(i)
+ continue
+ if stack[-1] == i:
+ stack.pop()
+ else:
+ stack.append(i)
+ return ''.join(stack)
+
+
+# print Solution().removeDuplicates('adcc')
diff --git a/Week_01/id_26/LeetCode_104_26.py b/Week_01/id_26/LeetCode_104_26.py
new file mode 100644
index 00000000..99f00308
--- /dev/null
+++ b/Week_01/id_26/LeetCode_104_26.py
@@ -0,0 +1,17 @@
+# Definition for a binary tree node.
+class TreeNode(object):
+ def __init__(self, x):
+ self.val = x
+ self.left = None
+ self.right = None
+
+
+class Solution(object):
+ def maxDepth(self, root):
+ """
+ :type root: TreeNode
+ :rtype: int
+ """
+ if not root:
+ return 0
+ return 1 + max(self.maxDepth(root.left), self.maxDepth(root.right))
diff --git a/Week_01/id_26/LeetCode_111_26.py b/Week_01/id_26/LeetCode_111_26.py
new file mode 100644
index 00000000..04f5b19a
--- /dev/null
+++ b/Week_01/id_26/LeetCode_111_26.py
@@ -0,0 +1,21 @@
+# Definition for a binary tree node.
+# class TreeNode(object):
+# def __init__(self, x):
+# self.val = x
+# self.left = None
+# self.right = None
+
+
+class Solution(object):
+ def minDepth(self, root):
+ """
+ :type root: TreeNode
+ :rtype: int
+ """
+ if not root:
+ return 0
+ left = self.minDepth(root.left)
+ right = self.minDepth(root.right)
+ if left and right:
+ return 1 + min(left, right)
+ return 1 + left + right
diff --git a/Week_01/id_26/LeetCode_15_26.py b/Week_01/id_26/LeetCode_15_26.py
new file mode 100644
index 00000000..cc5ed56d
--- /dev/null
+++ b/Week_01/id_26/LeetCode_15_26.py
@@ -0,0 +1,32 @@
+class Solution(object):
+ def threeSum(self, nums):
+ """
+ :type nums: List[int]
+ :rtype: List[List[int]]
+ 思路:
+ 1) 防止重复结果,所以先排序,遍历时跳过相邻的重复值
+ 2) 二分查找,大于0则右测向左移动,小于0则左边向右移动
+ """
+ nums.sort()
+ ret, n = [], len(nums)
+ for i in range(n):
+ if i > 0 and nums[i] == nums[i - 1]:
+ continue
+ left = i + 1
+ right = n - 1
+ while left < right:
+ tmp = nums[i] + nums[left] + nums[right]
+ if tmp == 0:
+ s = [nums[i], nums[left], nums[right]]
+ ret.append(s)
+ while left < right and nums[left] == nums[left + 1]:
+ left += 1
+ while left < right and nums[right] == nums[right - 1]:
+ right -= 1
+ right -= 1
+ left += 1
+ elif tmp > 0:
+ right -= 1
+ else:
+ left += 1
+ return ret
diff --git a/Week_01/id_26/LeetCode_174_26.py b/Week_01/id_26/LeetCode_174_26.py
new file mode 100644
index 00000000..6af2701d
--- /dev/null
+++ b/Week_01/id_26/LeetCode_174_26.py
@@ -0,0 +1,23 @@
+#!/usr/bin/python
+# -*-coding:utf-8 -*-
+
+
+class Solution(object):
+ def calculateMinimumHP(self, dungeon):
+ """
+ :type dungeon: List[List[int]]
+ :rtype: int
+ """
+ m = len(dungeon)
+ n = len(dungeon[0])
+ dp = [[1 << 31] * (n + 1) for _ in range(m + 1)]
+ dp[m][n - 1], dp[m - 1][n] = 1, 1
+ for i in range(m - 1, -1, -1):
+ for j in range(n - 1, -1, -1):
+ dp[i][j] = min(dp[i + 1][j], dp[i][j + 1]) - dungeon[i][j]
+ if dp[i][j] <= 0:
+ dp[i][j] = 1
+ return dp[0][0]
+
+
+print Solution().calculateMinimumHP([[-2, -3, 3], [-5, -10, 1], [10, 30, -5]])
diff --git a/Week_01/id_26/LeetCode_189_26.py b/Week_01/id_26/LeetCode_189_26.py
new file mode 100644
index 00000000..14dcd5f0
--- /dev/null
+++ b/Week_01/id_26/LeetCode_189_26.py
@@ -0,0 +1,27 @@
+class Solution(object):
+ def rotate(self, nums, k):
+ """
+ :type nums: List[int]
+ :type k: int
+ :rtype: None Do not return anything, modify nums in-place instead.
+ """
+ if not nums:
+ return []
+ k = k % len(nums)
+
+ def reverse(start, end):
+ while end > start:
+ nums[start], nums[end] = nums[end], nums[start]
+ start += 1
+ end -= 1
+
+ reverse(0, len(nums) - 1)
+ reverse(0, k - 1)
+ reverse(k, len(nums) - 1)
+ return nums
+
+
+print(Solution().rotate([1, 2, 3, 4, 5, 6, 7], 3))
+print(Solution().rotate([], 4))
+print(Solution().rotate([-1], 2))
+print(Solution().rotate([1, 2, 3, 4, 5, 6], 2))
diff --git a/Week_01/id_26/LeetCode_21_26.py b/Week_01/id_26/LeetCode_21_26.py
new file mode 100644
index 00000000..d1ccbb99
--- /dev/null
+++ b/Week_01/id_26/LeetCode_21_26.py
@@ -0,0 +1,31 @@
+# Definition for singly-linked list.
+class ListNode(object):
+ def __init__(self, x):
+ self.val = x
+ self.next = None
+
+
+class Solution(object):
+ def mergeTwoLists(self, l1, l2):
+ """
+ :type l1: ListNode
+ :type l2: ListNode
+ :rtype: ListNode
+ """
+ s = ListNode(0)
+ k = s
+ while l1 is not None or l2 is not None:
+ if l1 is None:
+ s.next = l2
+ l2 = None
+ elif l2 is None:
+ s.next = l1
+ l1 = None
+ elif l1.val <= l2.val:
+ s.next = ListNode(l1.val)
+ l1 = l1.next
+ else:
+ s.next = ListNode(l2.val)
+ l2 = l2.next
+ s = s.next
+ return k.next
diff --git a/Week_01/id_26/LeetCode_236_26.py b/Week_01/id_26/LeetCode_236_26.py
new file mode 100644
index 00000000..960af2c6
--- /dev/null
+++ b/Week_01/id_26/LeetCode_236_26.py
@@ -0,0 +1,27 @@
+# Definition for a binary tree node.
+class TreeNode(object):
+ def __init__(self, x):
+ self.val = x
+ self.left = None
+ self.right = None
+
+
+class Solution(object):
+ def lowestCommonAncestor(self, root, p, q):
+ """
+ :type root: TreeNode
+ :type p: TreeNode
+ :type q: TreeNode
+ :rtype: TreeNode
+ """
+ if not root:
+ return root
+ if root == p or root == q:
+ return root
+ left = self.lowestCommonAncestor(root.left, p, q)
+ right = self.lowestCommonAncestor(root.right, p, q)
+ if left is None:
+ return right
+ if right is None:
+ return left
+ return root
diff --git a/Week_01/id_26/LeetCode_242_26.py b/Week_01/id_26/LeetCode_242_26.py
new file mode 100644
index 00000000..a60e3004
--- /dev/null
+++ b/Week_01/id_26/LeetCode_242_26.py
@@ -0,0 +1,24 @@
+class Solution(object):
+ def isAnagram(self, s, t):
+ """
+ :type s: str
+ :type t: str
+ :rtype: bool
+ """
+ if len(s) != len(t):
+ return False
+ m = {}
+ for i in s:
+ if m.get(i) is None:
+ m[i] = 1
+ else:
+ m[i] += 1
+ for i in t:
+ if m.get(i) is None:
+ return False
+ else:
+ m[i] -= 1
+ for i in m.values():
+ if not i == 0:
+ return False
+ return True
diff --git a/Week_01/id_26/LeetCode_24_26.py b/Week_01/id_26/LeetCode_24_26.py
new file mode 100644
index 00000000..26ca5cda
--- /dev/null
+++ b/Week_01/id_26/LeetCode_24_26.py
@@ -0,0 +1,29 @@
+# Definition for singly-linked list.
+class ListNode(object):
+ def __init__(self, x):
+ self.val = x
+ self.next = None
+
+
+class Solution(object):
+ def swapPairs(self, head):
+ """
+ :type head: ListNode
+ :rtype: ListNode
+ """
+ if head is None:
+ return
+ if head.next is None:
+ return head
+ ret = ListNode(0)
+ p = ret
+ while head:
+ if head.next:
+ p.next = head.next
+ head.next = head.next.next
+ p.next.next = head
+ p = p.next.next
+ head = head.next
+ else:
+ head = head.next
+ return ret.next
\ No newline at end of file
diff --git a/Week_01/id_26/LeetCode_257_26.py b/Week_01/id_26/LeetCode_257_26.py
new file mode 100644
index 00000000..0d26b636
--- /dev/null
+++ b/Week_01/id_26/LeetCode_257_26.py
@@ -0,0 +1,29 @@
+# Definition for a binary tree node.
+# class TreeNode(object):
+# def __init__(self, x):
+# self.val = x
+# self.left = None
+# self.right = None
+
+
+class Solution(object):
+ def binaryTreePaths(self, root):
+ """
+ :type root: TreeNode
+ :rtype: List[str]
+ """
+ paths = []
+
+ def dfs(root, path=[]):
+ if not root:
+ return
+ path = path + [str(root.val)]
+ if not root.left and not root.right:
+ return paths.append('->'.join(path))
+ if root.left:
+ dfs(root.left, path)
+ if root.right:
+ dfs(root.right, path)
+
+ dfs(root)
+ return paths
diff --git a/Week_01/id_26/LeetCode_26_26.py b/Week_01/id_26/LeetCode_26_26.py
new file mode 100644
index 00000000..80904ef3
--- /dev/null
+++ b/Week_01/id_26/LeetCode_26_26.py
@@ -0,0 +1,12 @@
+class Solution(object):
+ def removeDuplicates(self, nums):
+ """
+ :type nums: List[int]
+ :rtype: int
+ """
+ k = 1
+ for n in nums:
+ if n != nums[k - 1]:
+ nums[k] = n
+ k += 1
+ return k
diff --git a/Week_01/id_26/LeetCode_42_26.py b/Week_01/id_26/LeetCode_42_26.py
new file mode 100644
index 00000000..f9c44241
--- /dev/null
+++ b/Week_01/id_26/LeetCode_42_26.py
@@ -0,0 +1,42 @@
+class Solution(object):
+ def trap(self, height):
+ """
+ :type height: List[int]
+ :rtype: int
+ """
+ i, j = 0, len(height) - 1
+ ret, left_max, right_max = 0, 0, 0
+ while i <= j:
+ left_max = max(left_max, height[i])
+ right_max = max(right_max, height[j])
+ if left_max < right_max:
+ ret += (left_max - height[i])
+ i += 1
+ else:
+ ret += (right_max - height[j])
+ j -= 1
+ return ret
+
+ def trap2(self, height):
+ if not height:
+ return 0
+
+ max_height = height.index(max(height))
+ ret = 0
+
+ max_baffle = 0
+ for i in range(1, max_height):
+ max_baffle = max(height[i - 1], max_baffle)
+ if height[i] < max_baffle:
+ ret += max_baffle - height[i]
+
+ max_baffle = 0
+ for i in range(len(height) - 2, max_height, -1):
+ max_baffle = max(height[i + 1], max_baffle)
+ if height[i] < max_baffle:
+ ret += max_baffle - height[i]
+ return ret
+
+
+print Solution().trap([0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1])
+print Solution().trap([5, 2, 1, 2, 1, 5])
diff --git a/Week_01/id_26/LeetCode_441_26.py b/Week_01/id_26/LeetCode_441_26.py
new file mode 100644
index 00000000..94a2967b
--- /dev/null
+++ b/Week_01/id_26/LeetCode_441_26.py
@@ -0,0 +1,20 @@
+class Solution(object):
+ def arrangeCoins(self, n):
+ """
+ :type n: int
+ :rtype: int
+ """
+ left, right = 0, n
+ while left <= right:
+ mid = (right + left) / 2
+ k = mid * (mid + 1)
+ if k <= 2 * n:
+ left = mid + 1
+ else:
+ right = mid - 1
+ return right
+
+
+print Solution().arrangeCoins(1)
+# print Solution().arrangeCoins(5)
+# print Solution().arrangeCoins(8)
diff --git a/Week_01/id_26/LeetCode_49_26.py b/Week_01/id_26/LeetCode_49_26.py
new file mode 100644
index 00000000..c22bc612
--- /dev/null
+++ b/Week_01/id_26/LeetCode_49_26.py
@@ -0,0 +1,18 @@
+class Solution(object):
+ def groupAnagrams(self, strs):
+ """
+ :type strs: List[str]
+ :rtype: List[List[str]]
+ """
+ if not strs:
+ return []
+ ret = {}
+ for s in strs:
+ key = "".join(sorted(s))
+ if key not in ret:
+ ret[key] = []
+ ret[key].append(s)
+ return ret.values()
+
+
+print Solution().groupAnagrams(["eat", "tea", "tan", "ate", "nat", "bat"])
diff --git a/Week_01/id_26/LeetCode_50_26.py b/Week_01/id_26/LeetCode_50_26.py
new file mode 100644
index 00000000..32f50e00
--- /dev/null
+++ b/Week_01/id_26/LeetCode_50_26.py
@@ -0,0 +1,26 @@
+class Solution(object):
+ def myPow(self, x, n):
+ """
+ :type x: float
+ :type n: int
+ :rtype: float
+ """
+
+ if n == 0:
+ return 1
+ if n == 1:
+ return x
+ if n < 0:
+ return 1.0 / self.myPow(x, -n)
+
+ t = self.myPow(x, n / 2)
+ if n & 1 == 0:
+ return t * t
+ else:
+ return x * t * t
+
+
+print Solution().myPow(2.00000, 10)
+print Solution().myPow(2.10000, 3)
+print Solution().myPow(2.00000, -2)
+print Solution().myPow(2.00000, -2147483648)
diff --git a/Week_01/id_26/LeetCode_783_26.py b/Week_01/id_26/LeetCode_783_26.py
new file mode 100644
index 00000000..c1666ffd
--- /dev/null
+++ b/Week_01/id_26/LeetCode_783_26.py
@@ -0,0 +1,28 @@
+# Definition for a binary tree node.
+# class TreeNode(object):
+# def __init__(self, x):
+# self.val = x
+# self.left = None
+# self.right = None
+
+
+class Solution(object):
+ def minDiffInBST(self, root):
+ """
+ :type root: TreeNode
+ :rtype: int
+ """
+ self.ret = self.preVal = 1 << 31
+
+ def dfs(node):
+ if self.ret == 1:
+ return
+ if not node:
+ return
+ dfs(node.left)
+ self.ret = min(abs(node.val - self.preVal), self.ret)
+ self.preVal = node.val
+ dfs(node.right)
+
+ dfs(root)
+ return self.ret
diff --git a/Week_01/id_26/LeetCode_84_26.py b/Week_01/id_26/LeetCode_84_26.py
new file mode 100644
index 00000000..7900cb6f
--- /dev/null
+++ b/Week_01/id_26/LeetCode_84_26.py
@@ -0,0 +1,23 @@
+class Solution(object):
+ def largestRectangleArea(self, heights):
+ """
+ :type heights: List[int]
+ :rtype: int
+ """
+
+ heights.append(0)
+ ret = 0
+ stack = [-1]
+ for i in xrange(len(heights)):
+ while heights[i] < heights[stack[-1]]:
+ h = heights[stack.pop()]
+ w = i - stack[-1] - 1
+ ret = max(ret, h * w)
+ stack.append(i)
+ return ret
+
+
+# print Solution().largestRectangleArea([1])
+print Solution().largestRectangleArea([1, 1])
+print Solution().largestRectangleArea([2, 1, 5, 6, 2, 3])
+print Solution().largestRectangleArea([2, 1, 2])
diff --git a/Week_01/id_26/LeetCode_88_26.py b/Week_01/id_26/LeetCode_88_26.py
new file mode 100644
index 00000000..0df23fce
--- /dev/null
+++ b/Week_01/id_26/LeetCode_88_26.py
@@ -0,0 +1,23 @@
+class Solution(object):
+ def merge(self, nums1, m, nums2, n):
+ """
+ :type nums1: List[int]
+ :type m: int
+ :type nums2: List[int]
+ :type n: int
+ :rtype: None Do not return anything, modify nums1 in-place instead.
+ """
+ i, j, k = m - 1, n - 1, m + n - 1
+ while j >= 0:
+ if i >= 0 and nums1[i] > nums2[j]:
+ nums1[k] = nums1[i]
+ i -= 1
+ else:
+ nums1[k] = nums2[j]
+ j -= 1
+ k -= 1
+ return nums1
+
+
+print Solution().merge([2, 2, 3, 0, 0, 0], 3, [2, 5, 6], 3)
+print Solution().merge([2, 2, 3, 0, 0, 0, 0], 3, [1, 2, 5, 6], 4)
diff --git a/Week_01/id_26/LeetCode_938_26.py b/Week_01/id_26/LeetCode_938_26.py
new file mode 100644
index 00000000..bc6cdf73
--- /dev/null
+++ b/Week_01/id_26/LeetCode_938_26.py
@@ -0,0 +1,50 @@
+# Definition for a binary tree node.
+# class TreeNode(object):
+# def __init__(self, x):
+# self.val = x
+# self.left = None
+# self.right = None
+
+
+class Solution(object):
+ def rangeSumBST(self, root, L, R):
+ """
+ :type root: TreeNode
+ :type L: int
+ :type R: int
+ :rtype: int
+ """
+ self.ret = 0
+
+ def bst(root, L, R):
+ if not root:
+ return
+ bst(root.left, L, R)
+ if root.val <= R and root.val >= L:
+ self.ret += root.val
+ bst(root.right, L, R)
+
+ bst(root, L, R)
+ return self.ret
+
+ def rangeSumBST2(self, root, L, R):
+ """
+ :type root: TreeNode
+ :type L: int
+ :type R: int
+ :rtype: int
+ """
+
+ def dfs(node):
+ if not node:
+ return
+ if L <= node.val <= R:
+ self.ans += node.val
+ if L < node.val:
+ dfs(node.left)
+ if node.val < R:
+ dfs(node.right)
+
+ self.ans = 0
+ dfs(root)
+ return self.ans
diff --git a/Week_01/id_26/NOTE.md b/Week_01/id_26/NOTE.md
index 107ea7d6..c8333bd4 100644
--- a/Week_01/id_26/NOTE.md
+++ b/Week_01/id_26/NOTE.md
@@ -1 +1,2 @@
# 学习笔记
+Chao:题目完成数目很多,非常好。代码结构清晰,简明扼要。希望继续做题,保持训练!
\ No newline at end of file
diff --git a/Week_01/id_27/123.jpg b/Week_01/id_27/123.jpg
new file mode 100644
index 00000000..d8078cd6
Binary files /dev/null and b/Week_01/id_27/123.jpg differ
diff --git a/Week_01/id_27/NOTE.md b/Week_01/id_27/NOTE.md
index 107ea7d6..5f5d35f3 100644
--- a/Week_01/id_27/NOTE.md
+++ b/Week_01/id_27/NOTE.md
@@ -1 +1,3 @@
# 学习笔记
+
+Chao: 代码总体看起来不错,继续保持联系。注意多看 leetcode 中文版的题解和国际版上的discuss高票代码。
\ No newline at end of file
diff --git a/Week_01/id_27/leedcode_783_027 b/Week_01/id_27/leedcode_783_027
new file mode 100644
index 00000000..f975a80a
--- /dev/null
+++ b/Week_01/id_27/leedcode_783_027
@@ -0,0 +1,24 @@
+/**
+ * Definition for a binary tree node.
+ * struct TreeNode {
+ * int val;
+ * TreeNode *left;
+ * TreeNode *right;
+ * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
+ * };
+ */
+class Solution {
+public:
+ int Res= INT_MAX;
+ int Pre = 0;
+ int minDiffInBST(TreeNode* root) {
+ if(root->left != NULL)
+ minDiffInBST(root->left);
+ if(Pre > 0)
+ Res = min(Res,root->val - Pre);
+ Pre = root->val;
+ if(root->right != NULL)
+ minDiffInBST(root->right);
+ return Res;
+ }
+};
diff --git a/Week_01/id_27/leetcode_441_027 b/Week_01/id_27/leetcode_441_027
new file mode 100644
index 00000000..fb8b50f0
--- /dev/null
+++ b/Week_01/id_27/leetcode_441_027
@@ -0,0 +1,11 @@
+class Solution {
+public:
+ int arrangeCoins(int n) {
+ int i = 1;
+ while (n >= i) {
+ n -= i;
+ i++;
+ }
+ return i - 1;
+ }
+};
diff --git a/Week_01/id_27/leetcode_783_027 b/Week_01/id_27/leetcode_783_027
new file mode 100644
index 00000000..f975a80a
--- /dev/null
+++ b/Week_01/id_27/leetcode_783_027
@@ -0,0 +1,24 @@
+/**
+ * Definition for a binary tree node.
+ * struct TreeNode {
+ * int val;
+ * TreeNode *left;
+ * TreeNode *right;
+ * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
+ * };
+ */
+class Solution {
+public:
+ int Res= INT_MAX;
+ int Pre = 0;
+ int minDiffInBST(TreeNode* root) {
+ if(root->left != NULL)
+ minDiffInBST(root->left);
+ if(Pre > 0)
+ Res = min(Res,root->val - Pre);
+ Pre = root->val;
+ if(root->right != NULL)
+ minDiffInBST(root->right);
+ return Res;
+ }
+};
diff --git a/Week_01/id_28/NOTE.md b/Week_01/id_28/NOTE.md
index 107ea7d6..08d026ba 100644
--- a/Week_01/id_28/NOTE.md
+++ b/Week_01/id_28/NOTE.md
@@ -1 +1,4 @@
# 学习笔记
+
+
+Chao: 注意代码格式和优化代码逻辑。多看 leetcode 中文版的题解和国际版上的discuss高票代码。
\ No newline at end of file
diff --git a/Week_01/id_28/src/LeetCode_174_28.java b/Week_01/id_28/src/LeetCode_174_28.java
new file mode 100644
index 00000000..717e0c84
--- /dev/null
+++ b/Week_01/id_28/src/LeetCode_174_28.java
@@ -0,0 +1,24 @@
+public class LeetCode_174_28 {
+ Integer[][] cache;
+ public int calculateMinimumHP(int[][] dungeon) {
+
+ cache=new Integer[dungeon.length][dungeon[0].length];
+ return Math.max(1,getMinNum(0,0,dungeon)-dungeon[0][0]);
+ }
+
+ public int getMinNum(int i,int j,int[][] dungeon){
+ if(cache[i][j]!=null){
+ return cache[i][j];
+ }
+ if(i==dungeon.length-1&&j==dungeon[0].length-1){
+ cache[i][j]=1;
+ }else if(i==dungeon.length-1){
+ cache[i][j]=Math.max(1,getMinNum(i,j+1,dungeon)-dungeon[i][j+1]);
+ }else if(j==dungeon[0].length-1){
+ cache[i][j]=Math.max(1,getMinNum(i+1,j,dungeon)-dungeon[i+1][j]);
+ }else {
+ cache[i][j]=Math.max(1,Math.min(getMinNum(i,j+1,dungeon)-dungeon[i][j+1],getMinNum(i+1,j,dungeon)-dungeon[i+1][j]));
+ }
+ return cache[i][j];
+ }
+}
diff --git a/Week_01/id_28/src/LeetCode_236_28.java b/Week_01/id_28/src/LeetCode_236_28.java
new file mode 100644
index 00000000..9caf6bde
--- /dev/null
+++ b/Week_01/id_28/src/LeetCode_236_28.java
@@ -0,0 +1,38 @@
+public class LeetCode_236_28 {
+ private TreeNode ret=null;
+
+ public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
+
+ if(ret!=null){
+ return ret;
+ }
+ return find(root,p,q);
+
+ }
+ /**
+ * 定义子问题:如果发现的 p 或 q,则返回;负责返回 null。
+ */
+ public TreeNode find(TreeNode node, TreeNode p, TreeNode q) {
+
+ if(ret==null){
+ TreeNode left;
+ TreeNode right;
+ if (node==null||node==p||node==q)
+ return node;
+ left=find(node.left,p,q);
+ right=find(node.right,p,q);
+
+
+ if (left==null){
+ return right;
+ }else if (right==null){
+ return left;
+ }else {
+ //ret=node;
+ return node;
+ }
+ }
+ return null;
+ }
+
+}
diff --git a/Week_01/id_28/src/TreeNode.java b/Week_01/id_28/src/TreeNode.java
new file mode 100644
index 00000000..2279914e
--- /dev/null
+++ b/Week_01/id_28/src/TreeNode.java
@@ -0,0 +1,6 @@
+public class TreeNode {
+ int val;
+ TreeNode left;
+ TreeNode right;
+ TreeNode(int x) { val = x; }
+}
diff --git a/Week_01/id_29/Algorithm.png b/Week_01/id_29/Algorithm.png
new file mode 100644
index 00000000..bcb626fc
Binary files /dev/null and b/Week_01/id_29/Algorithm.png differ
diff --git a/Week_01/id_29/LeetCode_021_29.go b/Week_01/id_29/LeetCode_021_29.go
new file mode 100644
index 00000000..0a758c06
--- /dev/null
+++ b/Week_01/id_29/LeetCode_021_29.go
@@ -0,0 +1,39 @@
+package main
+
+// LeetCode - 021. Merge Two Sorted Lists
+// https://leetcode.com/problems/merge-two-sorted-lists/
+func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {
+ // Check boundary condition
+ if l1 == nil {
+ return l2
+ }
+ if l2 == nil {
+ return l1
+ }
+
+ // Create dummy node
+ dummy := ListNode{}
+ head := &dummy
+
+ // Connect l1 and l2
+ for l1 != nil && l2 != nil {
+ if l1.Val < l2.Val {
+ head.Next = l1
+ l1 = l1.Next
+ } else {
+ head.Next = l2
+ l2 = l2.Next
+ }
+ head = head.Next
+ }
+
+ // Check leftover
+ if l1 != nil {
+ head.Next = l1
+ }
+ if l2 != nil {
+ head.Next = l2
+ }
+
+ return dummy.Next
+}
diff --git a/Week_01/id_29/LeetCode_024_29.go b/Week_01/id_29/LeetCode_024_29.go
new file mode 100644
index 00000000..bf0b0897
--- /dev/null
+++ b/Week_01/id_29/LeetCode_024_29.go
@@ -0,0 +1,24 @@
+package main
+
+// LeetCode - 024. Swap Nodes in Pairs
+// https://leetcode.com/problems/swap-nodes-in-pairs/
+func swapPairs(head *ListNode) *ListNode {
+ dummy := ListNode{}
+ dummy.Next = head
+
+ pre := &dummy
+
+ for pre != nil {
+ if pre.Next == nil || pre.Next.Next == nil {
+ break
+ }
+
+ first := pre.Next
+ pre.Next = first.Next
+ first.Next = first.Next.Next
+ pre.Next.Next = first
+ pre = first
+ }
+
+ return dummy.Next
+}
diff --git a/Week_01/id_29/LeetCode_026_29.go b/Week_01/id_29/LeetCode_026_29.go
new file mode 100644
index 00000000..576d3641
--- /dev/null
+++ b/Week_01/id_29/LeetCode_026_29.go
@@ -0,0 +1,16 @@
+package main
+
+// LeetCode - 026. Remove Duplicates from Sorted Array
+// https://leetcode.com/problems/remove-duplicates-from-sorted-array/
+func removeDuplicates(nums []int) int {
+ replaceIndex := 1
+
+ for curr := 1; curr < len(nums); curr++ {
+ if nums[curr] != nums[curr-1] {
+ nums[replaceIndex] = nums[curr]
+ replaceIndex++
+ }
+ }
+
+ return replaceIndex
+}
diff --git a/Week_01/id_29/LeetCode_049_29.go b/Week_01/id_29/LeetCode_049_29.go
new file mode 100644
index 00000000..e35df43c
--- /dev/null
+++ b/Week_01/id_29/LeetCode_049_29.go
@@ -0,0 +1,29 @@
+package main
+
+import (
+ "sort"
+ "strings"
+)
+
+// LeetCode - 49. Group Anagrams
+// https://leetcode.com/problems/group-anagrams/
+func SortString(w string) string {
+ s := strings.Split(w, "")
+ sort.Strings(s)
+ return strings.Join(s, "")
+}
+
+func groupAnagrams(strs []string) [][]string {
+ m := make(map[string][]string)
+
+ for _, w := range strs {
+ word := SortString(w)
+ m[word] = append(m[word], w)
+ }
+
+ var ss [][]string
+ for e := range m {
+ ss = append(ss, m[e])
+ }
+ return ss
+}
diff --git a/Week_01/id_29/LeetCode_050_29.go b/Week_01/id_29/LeetCode_050_29.go
new file mode 100644
index 00000000..ab3cf15a
--- /dev/null
+++ b/Week_01/id_29/LeetCode_050_29.go
@@ -0,0 +1,21 @@
+package main
+
+// LeetCode - 50. Pow(x, n)
+// https://leetcode.com/problems/powx-n/
+func myPow(x float64, n int) float64 {
+ if n == 0 {
+ return 1
+ }
+ if n == 1 {
+ return x
+ }
+ if n < 0 {
+ return 1 / myPow(x, -n)
+ }
+
+ if n%2 == 0 {
+ return myPow(x*x, n/2)
+ } else {
+ return x * myPow(x*x, n/2)
+ }
+}
diff --git a/Week_01/id_29/LeetCode_088_29.go b/Week_01/id_29/LeetCode_088_29.go
new file mode 100644
index 00000000..a374d13a
--- /dev/null
+++ b/Week_01/id_29/LeetCode_088_29.go
@@ -0,0 +1,20 @@
+package main
+
+// LeetCode - 088. Merge Sorted Array
+// https://leetcode.com/problems/merge-sorted-array/
+func merge(nums1 []int, m int, nums2 []int, n int) {
+ replaceIndex := m + n - 1
+ array1Target := m - 1
+ array2Target := n - 1
+
+ for array2Target >= 0 {
+ if array1Target >= 0 && nums2[array2Target] < nums1[array1Target] {
+ nums1[replaceIndex] = nums1[array1Target]
+ array1Target--
+ } else {
+ nums1[replaceIndex] = nums2[array2Target]
+ array2Target--
+ }
+ replaceIndex--
+ }
+}
diff --git a/Week_01/id_29/LeetCode_104_29.go b/Week_01/id_29/LeetCode_104_29.go
new file mode 100644
index 00000000..a6b2521a
--- /dev/null
+++ b/Week_01/id_29/LeetCode_104_29.go
@@ -0,0 +1,13 @@
+package main
+
+// LeetCode - 104. Maximum Depth of Binary Tree
+// https://leetcode.com/problems/maximum-depth-of-binary-tree/
+import "math"
+
+func maxDepth(root *TreeNode) int {
+ if root == nil {
+ return 0
+ }
+
+ return int(math.Max(float64(maxDepth(root.Left)), float64(maxDepth(root.Right))) + 1)
+}
diff --git a/Week_01/id_29/LeetCode_189_29.go b/Week_01/id_29/LeetCode_189_29.go
new file mode 100644
index 00000000..c53ed5bf
--- /dev/null
+++ b/Week_01/id_29/LeetCode_189_29.go
@@ -0,0 +1,21 @@
+package main
+
+// LeetCode - 189. Rotate Array
+// https://leetcode.com/problems/rotate-array/
+func rotate(nums []int, k int) {
+ n := len(nums)
+
+ k = k % n
+
+ reverse(nums, 0, n-1)
+ reverse(nums, 0, k-1)
+ reverse(nums, k, n-1)
+}
+
+func reverse(nums []int, i int, j int) {
+ for i < j {
+ nums[i], nums[j] = nums[j], nums[i]
+ i++
+ j--
+ }
+}
diff --git a/Week_01/id_29/LeetCode_242_29.go b/Week_01/id_29/LeetCode_242_29.go
new file mode 100644
index 00000000..5ddfafac
--- /dev/null
+++ b/Week_01/id_29/LeetCode_242_29.go
@@ -0,0 +1,38 @@
+package main
+
+// LeetCode - 242. Valid Anagram
+// https://leetcode.com/problems/valid-anagram/
+func isAnagram(s string, t string) bool {
+ if len(s) != len(t) {
+ return false
+ }
+
+ mapA := buildCharMap(s)
+ mapB := buildCharMap(t)
+
+ for key, Acount := range mapA {
+ Bcount, ok := mapB[key]
+ if !ok {
+ return false
+ }
+ if Acount != Bcount {
+ return false
+ }
+ }
+
+ return true
+}
+
+func buildCharMap(s string) map[rune]int {
+ m := make(map[rune]int)
+
+ for _, char := range s {
+ if _, ok := m[char]; ok {
+ m[char]++
+ } else {
+ m[char] = 1
+ }
+ }
+
+ return m
+}
diff --git a/Week_01/id_29/LeetCode_257_29.go b/Week_01/id_29/LeetCode_257_29.go
new file mode 100644
index 00000000..a59bca1f
--- /dev/null
+++ b/Week_01/id_29/LeetCode_257_29.go
@@ -0,0 +1,36 @@
+package main
+
+import "strconv"
+
+// LeetCode - 257. Binary Tree Paths
+// https://leetcode.com/problems/binary-tree-paths/
+func binaryTreePaths(root *TreeNode) []string {
+ if root == nil {
+ return nil
+ }
+
+ res := make([]string, 0, 16)
+
+ dfs("", root, &res)
+
+ return res
+}
+
+func dfs(path string, root *TreeNode, res *[]string) {
+ if path == "" {
+ path += strconv.Itoa(root.Val)
+ } else {
+ path += "->" + strconv.Itoa(root.Val)
+ }
+
+ if root.Left != nil {
+ dfs(path, root.Left, res)
+ }
+ if root.Right != nil {
+ dfs(path, root.Right, res)
+ }
+
+ if root.Left == nil && root.Right == nil {
+ *res = append(*res, path)
+ }
+}
diff --git a/Week_01/id_29/LeetCode_938_29.go b/Week_01/id_29/LeetCode_938_29.go
new file mode 100644
index 00000000..5b78ffe0
--- /dev/null
+++ b/Week_01/id_29/LeetCode_938_29.go
@@ -0,0 +1,19 @@
+package main
+
+// LeetCode - 938. Range Sum of BST
+// https://leetcode.com/problems/range-sum-of-bst/
+func rangeSumBST(root *TreeNode, L int, R int) int {
+ return dfs938(root, L, R)
+}
+
+func dfs938(root *TreeNode, L int, R int) int {
+ if root == nil {
+ return 0
+ }
+
+ if root.Val >= L && root.Val <= R {
+ return root.Val + dfs938(root.Left, L, R) + dfs938(root.Right, L, R)
+ }
+
+ return dfs938(root.Left, L, R) + dfs938(root.Right, L, R)
+}
diff --git a/Week_01/id_29/NOTE.md b/Week_01/id_29/NOTE.md
index 107ea7d6..7b502018 100644
--- a/Week_01/id_29/NOTE.md
+++ b/Week_01/id_29/NOTE.md
@@ -1 +1,3 @@
# 学习笔记
+
+Chao:代码优美、清晰,希望继续保持。另外多看 leetcode 中文版的题解和国际版上的discuss高票代码。
\ No newline at end of file
diff --git a/Week_01/id_29/main.go b/Week_01/id_29/main.go
new file mode 100644
index 00000000..28a3ee4d
--- /dev/null
+++ b/Week_01/id_29/main.go
@@ -0,0 +1,16 @@
+package main
+
+type ListNode struct {
+ Val int
+ Next *ListNode
+}
+
+type TreeNode struct {
+ Val int
+ Left *TreeNode
+ Right *TreeNode
+}
+
+func main() {
+
+}
diff --git a/Week_01/id_3/NOTE.md b/Week_01/id_3/NOTE.md
index 107ea7d6..4bd7a3b6 100644
--- a/Week_01/id_3/NOTE.md
+++ b/Week_01/id_3/NOTE.md
@@ -1 +1,17 @@
# 学习笔记
+
+## 小技巧
+python的数组下标访问比hash快多了
+
+l1, l2 = l2, l1
+这个语法不但简单,而且思路其实适用于任何语言。
+两个变量没有顺序要求,我们可以通过预处理的方式,强制变成有先后关系,这就避免了维护一个中间标量的尴尬
+
+python的异或实现 bool(n1) != bool(n2) js也可以参考
+
+
+DP 子问题有最优解 -> 全局最优解 找到最优子结构即可向上递推
+递归 可以遍历所有解,这个是DP做不到的
+
+
+# 代码和总结都非常不错,希望能继续保持这样的状态下去! Keep it up!
\ No newline at end of file
diff --git a/Week_01/id_3/array/15/LeetCode_15_3_v1.py b/Week_01/id_3/array/15/LeetCode_15_3_v1.py
new file mode 100644
index 00000000..efb287c5
--- /dev/null
+++ b/Week_01/id_3/array/15/LeetCode_15_3_v1.py
@@ -0,0 +1,58 @@
+def three_sum(nums):
+ r = []
+ if not nums or len(nums) < 3:
+ return r
+
+ cache = {}
+ dset = set()
+
+ new_nums = []
+
+ for n in nums:
+ count = 1 + cache.get(n, 0)
+ cache[n] = count
+ if n and count <= 2:
+ new_nums.append(n)
+
+ zero_count = cache.get(0, 0)
+ if zero_count >= 3:
+ r.append([0, 0, 0])
+
+ if zero_count > 0:
+ new_nums.append(0)
+
+ nums = new_nums
+ nums.sort()
+
+ length = len(nums)
+ for i in range(length):
+ n1 = nums[i]
+ # n1 >= 0 时说明已经遍历把有效的数据都进行遍历,继续遍历已经发生重复
+ if n1 >= 0:
+ break
+ for j in range(i+1, length):
+ n2 = nums[j]
+ if n1 == 0 and n2 == 0 and cache[0] < 3:
+ continue
+ s = -(n1 + n2)
+
+ # 迭代顺序是从小到大的
+ # 当-sum(n1,n2)的结果小于n2时 说明已经迭代出现了重复 -sum必然在之前已经迭代过
+ if s < n2:
+ break
+
+ if (s == n1 or s == n2) and cache.get(s, 0) == 1:
+ continue
+
+ if cache.get(s, 0):
+ arr = [n1, n2, s]
+ ds = '%s,%s' % (n1, n2)
+ if ds not in dset:
+ dset.add(ds)
+ r.append(arr)
+
+ return r
+
+
+# 需要进一步优化代码!
+# 优化很好
\ No newline at end of file
diff --git a/Week_01/id_3/array/15/LeetCode_15_3_v2.py b/Week_01/id_3/array/15/LeetCode_15_3_v2.py
new file mode 100644
index 00000000..0efa111d
--- /dev/null
+++ b/Week_01/id_3/array/15/LeetCode_15_3_v2.py
@@ -0,0 +1,6 @@
+def three_sum(nums):
+ nums, r = sorted(nums), set()
+ for i in [i for i in range(len(nums)-2) if i < 1 or nums[i] > nums[i-1]]:
+ d = {-nums[i]-n: j for j, n in enumerate(nums[i + 1:])}
+ r.update([(nums[i], n, -nums[i]-n) for j, n in enumerate(nums[i+1:]) if n in d and d[n] > j])
+ return list(map(list, r))
diff --git a/Week_01/id_3/array/15/test_15.py b/Week_01/id_3/array/15/test_15.py
new file mode 100644
index 00000000..f5d350fa
--- /dev/null
+++ b/Week_01/id_3/array/15/test_15.py
@@ -0,0 +1,24 @@
+import lc_15_v1
+import lc_15_v2
+
+f = lc_15_v1.three_sum
+# f = lc_15_v2.three_sum
+
+
+def check(nums, r):
+ _r = f(nums)
+ print(_r, r, _r == r)
+
+
+check([-1, 0, 1, 2, -1, -4],
+ [
+ [-1, 0, 1],
+ [-1, -1, 2]
+ ])
+
+
+check([0, 0], [])
+check([0, 0, 0], [[0, 0, 0]])
+
+check([-4, -2, -2, -2, 0, 1, 2, 2, 2, 3, 3, 4, 4, 6, 6],
+ [[-4, -2, 6], [-4, 0, 4], [-4, 1, 3], [-4, 2, 2], [-2, -2, 4], [-2, 0, 2]])
diff --git a/Week_01/id_3/array/189/LeetCode_189_3_v1.py b/Week_01/id_3/array/189/LeetCode_189_3_v1.py
new file mode 100644
index 00000000..2880a713
--- /dev/null
+++ b/Week_01/id_3/array/189/LeetCode_189_3_v1.py
@@ -0,0 +1,27 @@
+# 最大公约数
+# 每次数组挪动一步,挪动k次,毫无疑问是可以实现的,但是时间复杂度 O(kn) 是无法接受的
+# 如果每次移动的是nums[i]和nums[i+k],很可能无法遍历所有数据,例如len(nums)==9 k==3,此时只会在0,3,6三个下标之间进行移动
+# 根据规律总结 如len(nums)与k的最小公倍数 是每次进行k偏移交换的循环
+# 也就是len(nums)与k的最大公约数gcd会是产生循环迭代的次数。例如len(nums)==9 k==3 gcd==3 下标每次偏移3,3次就会出现循环。
+# 所以需要 len(nums)/gcd 次就可以交换所有的数据
+
+import math
+
+
+def rotate(nums, k):
+ if not nums:
+ return
+
+ length = len(nums)
+ k = k % length
+
+ if not k:
+ return
+
+ gcd = math.gcd(length, k)
+
+ for offset in range(gcd):
+ tmp = nums[offset]
+ for i in range(1, int(length/gcd) + 1):
+ index = (i*k + offset) % length
+ nums[index], tmp = tmp, nums[index]
diff --git a/Week_01/id_3/array/189/LeetCode_189_3_v2.py b/Week_01/id_3/array/189/LeetCode_189_3_v2.py
new file mode 100644
index 00000000..a3dedc2e
--- /dev/null
+++ b/Week_01/id_3/array/189/LeetCode_189_3_v2.py
@@ -0,0 +1,24 @@
+# 交换法
+# 1,2,3,4,5,6,7 进行3位置的移动 等价于 list[0:4]+list[0:3] 两段数据的位置交换
+# 位置交换的原地极简方案就是两次反转 [1,2,3,4,5,6,7] 反转0:4-> [4,3,2,1,5,6,7] 反转4:7-> [4,3,2,1,7,6,5] 全部反转-> [5,6,7,1,2,3,4]
+
+
+def rotate(nums, k):
+ if not nums:
+ return
+
+ length = len(nums)
+ if length == 1:
+ return
+
+ k = k % length
+
+ tail = length - k - 1
+ for i in range(int((length-k)/2)):
+ nums[i], nums[tail-i] = nums[tail-i], nums[i]
+
+ tail = -k
+ for i in range(int(k/2)):
+ nums[-i-1], nums[tail+i] = nums[tail+i], nums[-i-1]
+
+ nums.reverse()
diff --git a/Week_01/id_3/array/189/test_189.py b/Week_01/id_3/array/189/test_189.py
new file mode 100644
index 00000000..83ee5de0
--- /dev/null
+++ b/Week_01/id_3/array/189/test_189.py
@@ -0,0 +1,24 @@
+import lc_189_v1
+import lc_189_v2
+
+# f = lc_189_v1.rotate
+f = lc_189_v2.rotate
+
+
+def check(params, k, arr):
+ _p = list(params)
+ f(params, k)
+ print(_p, params == arr)
+
+
+check([1, 2, 3, 4, 5, 6, 7], 3, [5, 6, 7, 1, 2, 3, 4])
+check([1, 2, 3, 4, 5, 6], 3, [4, 5, 6, 1, 2, 3])
+check([1, 2, 3], 7, [3, 1, 2])
+check([-1], 2, [-1])
+check(
+ [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
+ 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54],
+ 45,
+ [10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
+ 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 1, 2, 3, 4, 5, 6, 7, 8, 9]
+)
diff --git a/Week_01/id_3/array/26/LeetCode_26_3_v1.py b/Week_01/id_3/array/26/LeetCode_26_3_v1.py
new file mode 100644
index 00000000..0e08b7b4
--- /dev/null
+++ b/Week_01/id_3/array/26/LeetCode_26_3_v1.py
@@ -0,0 +1,12 @@
+def remove_duplicates(nums):
+ if not nums:
+ return 0
+
+ i = 1
+ cur = nums[0]
+ for n in nums:
+ if n != cur:
+ nums[i] = cur = n
+ i += 1
+
+ return i
diff --git a/Week_01/id_3/array/26/test_26.py b/Week_01/id_3/array/26/test_26.py
new file mode 100644
index 00000000..74085dbb
--- /dev/null
+++ b/Week_01/id_3/array/26/test_26.py
@@ -0,0 +1,12 @@
+import lc_26_v1
+
+f = lc_26_v1.remove_duplicates
+
+
+def check(params, length, arr):
+ _p = list(params)
+ print(_p, f(params) == length and params[:length] == arr)
+
+
+check([], 0, [])
+check([1, 1, 2, 3], 3, [1, 2, 3])
diff --git a/Week_01/id_3/array/88/LeetCode_88_3_v1.py b/Week_01/id_3/array/88/LeetCode_88_3_v1.py
new file mode 100644
index 00000000..14856118
--- /dev/null
+++ b/Week_01/id_3/array/88/LeetCode_88_3_v1.py
@@ -0,0 +1,16 @@
+# nums1 m -> m+n 位置是剩余空间 如果按从小到大排序会出现复杂的冲突
+# 而从大到小排列, 最大的元素移动到剩余空间的末端,则可以避免出现冲突
+
+
+def merge(nums1, m, nums2, n):
+ tail = m + n
+ for i in range(tail):
+ if n == 0:
+ break
+ tail -= 1
+ if m > 0 and nums1[m-1] > nums2[n-1]:
+ m -= 1
+ nums1[tail] = nums1[m]
+ else:
+ n -= 1
+ nums1[tail] = nums2[n]
diff --git a/Week_01/id_3/array/88/LeetCode_88_3_v2.py b/Week_01/id_3/array/88/LeetCode_88_3_v2.py
new file mode 100644
index 00000000..1fe5fd04
--- /dev/null
+++ b/Week_01/id_3/array/88/LeetCode_88_3_v2.py
@@ -0,0 +1,5 @@
+# 题目并未要求原地排序 所以弄个简单的
+
+
+def merge(nums1, m, nums2, n):
+ nums1[:m+n] = sorted(nums1[:m] + nums2[:n])
diff --git a/Week_01/id_3/array/88/test_88.py b/Week_01/id_3/array/88/test_88.py
new file mode 100644
index 00000000..6fb6b5fa
--- /dev/null
+++ b/Week_01/id_3/array/88/test_88.py
@@ -0,0 +1,13 @@
+import lc_88_v1
+import lc_88_v2
+
+f = lc_88_v1.merge
+# f = lc_88_v2.merge
+
+
+def check(nums1, m, nums2, n, r):
+ f(nums1, m, nums2, n)
+ print(nums1, nums1 == r)
+
+
+check([1, 2, 3, 0, 0, 0], 3, [2, 5, 6], 3, [1, 2, 2, 3, 5, 6])
diff --git a/Week_01/id_3/bs/441/LeetCode_441_3_v1.py b/Week_01/id_3/bs/441/LeetCode_441_3_v1.py
new file mode 100644
index 00000000..3dbe67ad
--- /dev/null
+++ b/Week_01/id_3/bs/441/LeetCode_441_3_v1.py
@@ -0,0 +1,10 @@
+def arrange_coins(n):
+ if n <= 0:
+ return 0
+ s = 0
+ k = 0
+ while s <= n:
+ k += 1
+ s += k
+
+ return k - 1
diff --git a/Week_01/id_3/bs/441/LeetCode_441_3_v2.py b/Week_01/id_3/bs/441/LeetCode_441_3_v2.py
new file mode 100644
index 00000000..92fd7be5
--- /dev/null
+++ b/Week_01/id_3/bs/441/LeetCode_441_3_v2.py
@@ -0,0 +1,23 @@
+# 此题超时了 有待用二分优化
+
+
+def arrange_coins(n):
+ if n <= 0:
+ return 0
+ k = 1
+
+ for (;;) {
+
+ }
+
+ while True:
+ s = int(((1 + k) * k)/2)
+ print(s, k)
+ if s == n:
+ return k
+ if s > n:
+ return k - 1
+ k += 1
+
+
+# 别这么搞
diff --git a/Week_01/id_3/bs/441/test_441.py b/Week_01/id_3/bs/441/test_441.py
new file mode 100644
index 00000000..73393066
--- /dev/null
+++ b/Week_01/id_3/bs/441/test_441.py
@@ -0,0 +1,15 @@
+import lc_441_v1
+import lc_441_v2
+
+# f = lc_441_v1.arrange_coins
+f = lc_441_v2.arrange_coins
+
+
+def check(n, r):
+ _r = f(n)
+ print(_r, r, _r == r)
+
+
+check(5, 2)
+check(8, 3)
+check(2146533481, 65521)
diff --git a/Week_01/id_3/bs/bs_basis.py b/Week_01/id_3/bs/bs_basis.py
new file mode 100644
index 00000000..f4982618
--- /dev/null
+++ b/Week_01/id_3/bs/bs_basis.py
@@ -0,0 +1,90 @@
+def bs(nums, x):
+ if not nums:
+ return -1
+ length = len(nums)
+ low = 0
+ high = length - 1
+ while low <= high:
+ mid = low + int((high - low)/2)
+ v = nums[mid]
+ if v == x:
+ return mid
+ if v > x:
+ high = mid - 1
+ else:
+ low = mid + 1
+
+ return -1
+
+
+def bs_first(nums, x):
+ if not nums:
+ return -1
+ length = len(nums)
+ low = 0
+ high = length - 1
+ while low <= high:
+ mid = low + int((high - low)/2)
+ v = nums[mid]
+ if v >= x:
+ high = mid - 1
+ else:
+ low = mid + 1
+
+ if low < length and nums[low] == x:
+ return low
+
+ return -1
+
+
+def bs_last(nums, x):
+ low = 0
+ high = len(nums) - 1
+ while low <= high:
+ mid = low + (high - low)//2
+ v = nums[mid]
+ if v > x:
+ high = mid - 1
+ else:
+ low = mid + 1
+ if high >= 0 and nums[high] == x:
+ return high
+ return -1
+
+
+def bs_gte(nums, x):
+ low = 0
+ high = len(nums) - 1
+ while low <= high:
+ mid = low + (high - low)//2
+ v = nums[mid]
+ if v >= x:
+ high = mid - 1
+ else:
+ low = mid + 1
+
+ return low
+
+
+# print(bs([8, 11, 19, 23, 27, 33, 45, 55, 67, 98], 19) == 2)
+# print(bs([8, 11, 19, 23, 27, 33, 45, 55, 67, 98], 33) == 5)
+# print(bs([8, 11, 19, 23, 27, 33, 45, 55, 67, 98], 18) == -1)
+# print(bs([8, 8, 11, 11, 19, 23, 27, 33, 45, 55, 67, 98], 19) == 4)
+#
+# print(bs_first([8, 8, 8, 11, 11, 19, 23, 27, 33, 45, 55, 67, 98], 11) == 3)
+# print(bs_first([8, 8, 8, 11, 11, 19, 23, 27, 33, 45, 55, 67, 98], 8) == 0)
+# print(bs_first([8, 8, 11, 11, 19, 23, 27, 33, 45, 55, 67, 98], 18) == -1)
+# print(bs_first([8, 8, 11, 11, 19, 23, 27, 33, 45, 55, 67, 98], 188) == -1)
+# print(bs_first([8, 8, 11, 11, 19, 23, 27, 33, 45, 55, 67, 98], 1) == -1)
+
+print(bs_last([8, 8, 8, 11, 11, 19, 23, 27, 33, 45, 55, 67, 98], 11) == 4)
+print(bs_last([8, 8, 8, 11, 11, 19, 23, 27, 33, 45, 55, 67, 98], 8) == 2)
+print(bs_last([8, 8, 11, 11, 19, 23, 27, 33, 45, 55, 67, 98], 18) == -1)
+print(bs_last([8, 8, 11, 11, 19, 23, 27, 33, 45, 55, 67, 98], 188) == -1)
+print(bs_last([8, 8, 11, 11, 19, 23, 27, 33, 45, 55, 67, 98], 1) == -1)
+
+# print(bs_gte([8, 8, 11, 11, 19, 23, 27, 33, 45, 55, 67, 98], 17) == 4)
+# print(bs_gte([8, 8, 11, 11, 19, 23, 27, 33, 45, 55, 67, 98], 19) == 4)
+# print(bs_gte([8, 8, 11, 11, 19, 23, 27, 33, 45, 55, 67, 98], 100) == 12)
+# print(bs_gte([8, 8, 11, 11, 19, 23, 27, 33, 45, 55, 67, 98], 8) == 0)
+# print(bs_gte([8, 8, 11, 11, 19, 23, 27, 33, 45, 55, 67, 98], 7) == 0)
diff --git a/Week_01/id_3/hash/242/LeetCode_242_3_v1.py b/Week_01/id_3/hash/242/LeetCode_242_3_v1.py
new file mode 100644
index 00000000..0d654d04
--- /dev/null
+++ b/Week_01/id_3/hash/242/LeetCode_242_3_v1.py
@@ -0,0 +1,16 @@
+def is_anagram(s, t):
+ if len(s) != len(t):
+ return False
+
+ arr = [0] * 26
+ m = ord('a')
+ for c in s:
+ arr[ord(c) % m] += 1
+
+ for c in t:
+ i = ord(c) % m
+ if arr[i] == 0:
+ return False
+ arr[i] -= 1
+
+ return True
diff --git a/Week_01/id_3/hash/242/test_242.py b/Week_01/id_3/hash/242/test_242.py
new file mode 100644
index 00000000..5e4b539f
--- /dev/null
+++ b/Week_01/id_3/hash/242/test_242.py
@@ -0,0 +1,6 @@
+import lc_242_v1
+
+f = lc_242_v1.is_anagram
+
+print(f('anagram', 'nagaram'))
+print(not f('rat', 'car'))
diff --git a/Week_01/id_3/hash/49/LeetCode_49_3_v1.py b/Week_01/id_3/hash/49/LeetCode_49_3_v1.py
new file mode 100644
index 00000000..ce9c068c
--- /dev/null
+++ b/Week_01/id_3/hash/49/LeetCode_49_3_v1.py
@@ -0,0 +1,13 @@
+def group_anagrams(strs):
+ m = {}
+ for s in strs:
+ k = ''.join(sorted(c for c in s))
+ l = m.get(k, [])
+ l.append(s)
+ m[k] = l
+
+ return list(m.values())
+
+
+
+# 非常好的代码!
\ No newline at end of file
diff --git a/Week_01/id_3/hash/49/test_49.py b/Week_01/id_3/hash/49/test_49.py
new file mode 100644
index 00000000..df14d8d6
--- /dev/null
+++ b/Week_01/id_3/hash/49/test_49.py
@@ -0,0 +1,10 @@
+import lc_49_v1
+
+f = lc_49_v1.group_anagrams
+
+print(f(["eat", "tea", "tan", "ate", "nat", "bat"]),
+ [
+ ["ate", "eat", "tea"],
+ ["nat", "tan"],
+ ["bat"]
+ ])
diff --git a/Week_01/id_3/linked/21/LeetCode_21_3_v1.py b/Week_01/id_3/linked/21/LeetCode_21_3_v1.py
new file mode 100644
index 00000000..2ec4b375
--- /dev/null
+++ b/Week_01/id_3/linked/21/LeetCode_21_3_v1.py
@@ -0,0 +1,16 @@
+class ListNode:
+ def __init__(self, x):
+ self.val = x
+ self.next = None
+
+
+def merge(l1, l2):
+ cur = root = ListNode(0)
+ while l1 and l2:
+ if l1.val > l2.val:
+ l1, l2 = l2, l1
+ cur.next = l1
+ cur = l1
+ l1 = l1.next
+ cur.next = l1 or l2
+ return root.next
diff --git a/Week_01/id_3/linked/21/LeetCode_21_3_v2.py b/Week_01/id_3/linked/21/LeetCode_21_3_v2.py
new file mode 100644
index 00000000..2236affa
--- /dev/null
+++ b/Week_01/id_3/linked/21/LeetCode_21_3_v2.py
@@ -0,0 +1,11 @@
+# 本代码按python语法进行优化 查看之前得提交可以看到更远古的写法
+
+
+def merge(l1, l2):
+ if not l1 or not l2:
+ return l1 or l2
+
+ if l1.val > l2.val:
+ l1, l2 = l2, l1
+ l1.next = merge(l1.next, l2)
+ return l1
diff --git a/Week_01/id_3/linked/21/test_21.py b/Week_01/id_3/linked/21/test_21.py
new file mode 100644
index 00000000..76113534
--- /dev/null
+++ b/Week_01/id_3/linked/21/test_21.py
@@ -0,0 +1,41 @@
+import lc_21_v1
+import lc_21_v2
+
+# f = lc_21_v1.merge
+f = lc_21_v2.merge
+
+
+class ListNode:
+ def __init__(self, x):
+ self.val = x
+ self.next = None
+
+
+def build(l):
+ root = None
+ prev = None
+ for x in l:
+ node = ListNode(x)
+ if prev:
+ prev.next = node
+ if not root:
+ root = node
+ prev = node
+
+ return root
+
+
+def export(root):
+ r = [root.val]
+ while root.next:
+ root = root.next
+ r.append(root.val)
+ print(r)
+ return r
+
+
+def check(l1, l2, r):
+ print(export(f(build(l1), build(l2))) == r)
+
+
+check([1, 2, 4], [1, 3, 4], [1, 1, 2, 3, 4, 4])
diff --git a/Week_01/id_3/linked/24/LeetCode_24_3_v1.py b/Week_01/id_3/linked/24/LeetCode_24_3_v1.py
new file mode 100644
index 00000000..0dcf7fe8
--- /dev/null
+++ b/Week_01/id_3/linked/24/LeetCode_24_3_v1.py
@@ -0,0 +1,7 @@
+def swap(head):
+ if not head or not head.next:
+ return head
+ nxt = head.next
+ head.next = swap(nxt.next)
+ nxt.next = head
+ return nxt
diff --git a/Week_01/id_3/linked/24/LeetCode_24_3_v2.py b/Week_01/id_3/linked/24/LeetCode_24_3_v2.py
new file mode 100644
index 00000000..9b5acaa5
--- /dev/null
+++ b/Week_01/id_3/linked/24/LeetCode_24_3_v2.py
@@ -0,0 +1,18 @@
+class ListNode:
+ def __init__(self, x):
+ self.val = x
+ self.next = None
+
+
+def swap(head):
+ if not head or not head.next:
+ return head
+
+ root = prev = ListNode(0)
+ while head and head.next:
+ nxt = head.next
+ prev.next = nxt
+ nxt.next, prev, head = head, head, nxt.next
+
+ prev.next = head
+ return root.next
diff --git a/Week_01/id_3/linked/24/test_24.py b/Week_01/id_3/linked/24/test_24.py
new file mode 100644
index 00000000..a2f6757d
--- /dev/null
+++ b/Week_01/id_3/linked/24/test_24.py
@@ -0,0 +1,42 @@
+import lc_24_v1
+import lc_24_v2
+
+# f = lc_24_v1.swap
+f = lc_24_v2.swap
+
+
+class ListNode:
+ def __init__(self, x):
+ self.val = x
+ self.next = None
+
+
+def build(l):
+ root = None
+ prev = None
+ for x in l:
+ node = ListNode(x)
+ if prev:
+ prev.next = node
+ if not root:
+ root = node
+ prev = node
+
+ return root
+
+
+def export(root):
+ r = [root.val]
+ while root.next:
+ root = root.next
+ r.append(root.val)
+ return r
+
+
+def check(l, r):
+ _r = export(f(build(l)))
+ print(_r, r, _r == r)
+
+
+check([1, 2, 3, 4], [2, 1, 4, 3])
+check([1, 2, 3], [2, 1, 3])
diff --git a/Week_01/id_3/recursion/101/LeetCode_101_3_v1.py b/Week_01/id_3/recursion/101/LeetCode_101_3_v1.py
new file mode 100644
index 00000000..f122c4bd
--- /dev/null
+++ b/Week_01/id_3/recursion/101/LeetCode_101_3_v1.py
@@ -0,0 +1,39 @@
+# 尝试使用广度优先 比较层内是否对称
+def is_symmetric(root):
+ queue = [root.left, root.right]
+ while len(queue) > 0:
+ r = is_mirror(queue)
+ if not r:
+ return False
+ for i in range(len(queue)):
+ n = queue.pop()
+ if not n:
+ continue
+ queue.insert(0, n.left)
+ queue.insert(0, n.right)
+
+ return True
+
+# 可能逻辑上有bug
+
+def is_mirror(queue):
+ length = len(queue)
+ if length == 1:
+ return True
+ if length % 2 == 1:
+ return False
+
+ for (i ,j )
+
+ # 优化代码
+ for i in range(int(length/2)):
+ n1 = queue[i]
+ n2 = queue[length - i - 1]
+ if not n1 and not n2:
+ continue
+ if bool(n1) != bool(n2):
+ return False
+ if n1.val != n2.val:
+ return False
+
+ return True
diff --git a/Week_01/id_3/recursion/101/LeetCode_101_3_v2.py b/Week_01/id_3/recursion/101/LeetCode_101_3_v2.py
new file mode 100644
index 00000000..4d749695
--- /dev/null
+++ b/Week_01/id_3/recursion/101/LeetCode_101_3_v2.py
@@ -0,0 +1,25 @@
+"""
+ 参考答案 两颗子树的对称比较,除了比较根节点外,还要比较t1.left是否与t2.right对称, t1.right 是否与t2.left对称
+ 在进行深度优先遍历的时候,每次针对要进行判断是否是镜像的子树进行迭代
+ 1
+ / \
+ 2 2
+ / \ / \
+ 3 4 4 3
+"""
+
+
+def is_symmetric(root):
+ return is_mirror(root.left, root.right)
+
+
+
+def is_mirror(t1, t2):
+ if not t1 and not t2:
+ return True
+ if bool(t1) != bool(t2): # bool ? the reason ?
+ return False
+ if t1.val != t2.val:
+ return False
+
+ return is_mirror(t1.left, t2.right) and is_mirror(t1.right, t2.left)
diff --git a/Week_01/id_3/recursion/101/LeetCode_101_3_v3.py b/Week_01/id_3/recursion/101/LeetCode_101_3_v3.py
new file mode 100644
index 00000000..0be05ef4
--- /dev/null
+++ b/Week_01/id_3/recursion/101/LeetCode_101_3_v3.py
@@ -0,0 +1,28 @@
+"""
+ 参考答案 略做修改 两颗子树的对称比较,除了比较根节点外,还要比较t1.left是否与t2.right对称, t1.right 是否与t2.left对称
+ DFS遍历的时候进行一些变体,使每次将需要对比的两个子树相邻入栈,每次也取出两个节点进行对比,当遇到一次不对称的节点就返回失败。
+ 1
+ / \
+ 2 2
+ / \ / \
+ 3 4 4 3
+"""
+
+
+def is_symmetric(root):
+ stack = [root.left, root.right]
+ while len(stack) > 0:
+ n1 = stack.pop()
+ n2 = stack.pop()
+ if not n1 and not n2:
+ continue
+ if bool(n1) != bool(n2):
+ return False
+ if n1.val != n2.val:
+ return False
+ stack.append(n1.left)
+ stack.append(n2.right)
+ stack.append(n1.right)
+ stack.append(n2.left)
+
+ return True
diff --git a/Week_01/id_3/recursion/101/test_101.py b/Week_01/id_3/recursion/101/test_101.py
new file mode 100644
index 00000000..bb390fbd
--- /dev/null
+++ b/Week_01/id_3/recursion/101/test_101.py
@@ -0,0 +1,38 @@
+class TreeNode:
+ def __init__(self, x):
+ self.val = x
+ self.left = None
+ self.right = None
+
+
+def build(nums):
+ if not nums:
+ return None
+
+ return build_node(nums, 1)
+
+
+def build_node(nums, i):
+ if len(nums) < i or nums[i-1] is None:
+ return None
+ node = TreeNode(nums[i-1])
+ node.left = build_node(nums, 2 * i)
+ node.right = build_node(nums, 2 * i + 1)
+ return node
+
+
+import lc_101_v1
+import lc_101_v2
+import lc_101_v3
+
+# f = lc_101_v1.is_symmetric
+f = lc_101_v2.is_symmetric
+# f = lc_101_v3.is_symmetric
+
+
+def check(nums):
+ print(f(build(nums)))
+
+
+check([1, 2, 2, 3, 4, 4, 3])
+check([1, 2, 2, None, 3, None, 3])
diff --git a/Week_01/id_3/recursion/104/LeetCode_104_3_v1.py b/Week_01/id_3/recursion/104/LeetCode_104_3_v1.py
new file mode 100644
index 00000000..17237338
--- /dev/null
+++ b/Week_01/id_3/recursion/104/LeetCode_104_3_v1.py
@@ -0,0 +1,4 @@
+def max_depth(root):
+ if not root:
+ return 0
+ return max(max_depth(root.left), max_depth(root.right)) + 1
diff --git a/Week_01/id_3/recursion/104/LeetCode_104_3_v2.py b/Week_01/id_3/recursion/104/LeetCode_104_3_v2.py
new file mode 100644
index 00000000..7aac2393
--- /dev/null
+++ b/Week_01/id_3/recursion/104/LeetCode_104_3_v2.py
@@ -0,0 +1,2 @@
+def max_depth(root):
+ pass
diff --git a/Week_01/id_3/recursion/104/test_104.py b/Week_01/id_3/recursion/104/test_104.py
new file mode 100644
index 00000000..ad8861fd
--- /dev/null
+++ b/Week_01/id_3/recursion/104/test_104.py
@@ -0,0 +1,37 @@
+class TreeNode:
+ def __init__(self, x):
+ self.val = x
+ self.left = None
+ self.right = None
+
+
+def build(nums):
+ if not nums:
+ return None
+
+ return build_node(nums, 1)
+
+
+def build_node(nums, i):
+ if len(nums) < i or nums[i-1] is None:
+ return None
+ node = TreeNode(nums[i-1])
+ node.left = build_node(nums, 2 * i)
+ node.right = build_node(nums, 2 * i + 1)
+ return node
+
+
+import LeetCode_104_3_v1
+import LeetCode_104_3_v2
+
+# f = LeetCode_104_3_v1.max_depth
+f = LeetCode_104_3_v2.max_depth
+
+
+def check(nums, r):
+ _r = f(build(nums))
+ print(_r, r, _r == r)
+
+
+check([3, 9, 20, None, None, 15, 7], 3)
+check([0, 2, 4, 1, None, 3, -1, 5, 1, None, 6, None, 8], 4)
diff --git a/Week_01/id_3/recursion/236/LeetCode_236_3_v1.py b/Week_01/id_3/recursion/236/LeetCode_236_3_v1.py
new file mode 100644
index 00000000..ae71f426
--- /dev/null
+++ b/Week_01/id_3/recursion/236/LeetCode_236_3_v1.py
@@ -0,0 +1,11 @@
+def lowest_common_ancestor(root, p, q):
+ if not root or root.val == p.val or root.val == q.val:
+ return root
+ left = lowest_common_ancestor(root.left, p, q)
+ right = lowest_common_ancestor(root.right, p, q)
+
+
+ # 三目表达识
+ if left and right:
+ return root
+ return left or right
diff --git a/Week_01/id_3/recursion/236/test_236.py b/Week_01/id_3/recursion/236/test_236.py
new file mode 100644
index 00000000..eda7d424
--- /dev/null
+++ b/Week_01/id_3/recursion/236/test_236.py
@@ -0,0 +1,35 @@
+class TreeNode:
+ def __init__(self, x):
+ self.val = x
+ self.left = None
+ self.right = None
+
+
+def build(nums):
+ if not nums:
+ return None
+
+ return build_node(nums, 1)
+
+
+def build_node(nums, i):
+ if len(nums) < i or nums[i-1] is None:
+ return None
+ node = TreeNode(nums[i-1])
+ node.left = build_node(nums, 2 * i)
+ node.right = build_node(nums, 2 * i + 1)
+ return node
+
+
+import lc_236_v1
+
+f = lc_236_v1.lowest_common_ancestor
+
+
+def check(nums, p, q, r):
+ _r = f(build(nums), TreeNode(p), TreeNode(q))
+ print(_r.val, r, _r.val == r)
+
+
+check([3, 5, 1, 6, 2, 0, 8, None, None, 7, 4], 5, 1, 3)
+check([3, 5, 1, 6, 2, 0, 8, None, None, 7, 4], 5, 7, 5)
diff --git a/Week_01/id_3/recursion/257/LeetCode_257_3_v1.py b/Week_01/id_3/recursion/257/LeetCode_257_3_v1.py
new file mode 100644
index 00000000..c03d75c6
--- /dev/null
+++ b/Week_01/id_3/recursion/257/LeetCode_257_3_v1.py
@@ -0,0 +1,21 @@
+class Solution:
+ def binaryTreePaths(self, root):
+ results = []
+ if not root:
+ return results
+ path_stack = []
+ self.dfs(root, path_stack, results)
+ return results
+
+ def dfs(self, node, path_stack, results):
+ path_stack.append(str(node.val))
+ if not node.left and not node.right:
+ results.append('->'.join(path_stack))
+ path_stack.pop()
+ return
+ if node.left:
+ self.dfs(node.left, path_stack, results)
+ if node.right:
+ self.dfs(node.right, path_stack, results)
+
+ path_stack.pop()
diff --git a/Week_01/id_3/recursion/322/LeetCode_322_3_v1.py b/Week_01/id_3/recursion/322/LeetCode_322_3_v1.py
new file mode 100644
index 00000000..50449313
--- /dev/null
+++ b/Week_01/id_3/recursion/322/LeetCode_322_3_v1.py
@@ -0,0 +1,37 @@
+class Solution:
+
+ def coin_change(self, coins, amount):
+ if amount == 0:
+ return 0
+ _max = amount + 1
+ self.max = _max
+ self.result = _max
+ self.dp = [0 for i in range(amount)]
+ coins.sort(reverse=True)
+ self.dfs(coins, amount, 0, 0)
+ if self.result == _max:
+ return -1
+ else:
+ return self.result
+
+ def dfs(self, coins, amount, cur_sum, cur_times):
+ if cur_times >= self.result:
+ return
+ for c in coins:
+ new_sum = cur_sum + c
+ if new_sum > amount:
+ continue
+ next_times = cur_times + 1
+ if new_sum == amount:
+ self.result = min(self.result, next_times)
+ return
+ dp = self.dp
+ if not dp[new_sum] or dp[new_sum] > next_times:
+ dp[new_sum] = next_times
+ self.dfs(coins, amount, new_sum, next_times)
+
+ if len(coins) > 0:
+ coins = coins[1:]
+
+
+print(Solution().coin_change([186, 419, 83, 408], 6249))
diff --git a/Week_01/id_3/recursion/783/LeetCode_783_3_v1.py b/Week_01/id_3/recursion/783/LeetCode_783_3_v1.py
new file mode 100644
index 00000000..40805343
--- /dev/null
+++ b/Week_01/id_3/recursion/783/LeetCode_783_3_v1.py
@@ -0,0 +1,20 @@
+class Solution:
+ def minDiffInBST(self, root) -> int:
+ if not root:
+ return 0
+ stack = []
+ node = root
+ # 题目中有说明取值在 2 - 100
+ diff = 99
+ last = -100
+ while stack or node:
+ if node:
+ stack.append(node)
+ node = node.left
+ else:
+ node = stack.pop()
+ diff = min(diff, node.val - last)
+ last = node.val
+ node = node.right
+
+ return diff
diff --git a/Week_01/id_3/recursion/783/LeetCode_783_3_v2.py b/Week_01/id_3/recursion/783/LeetCode_783_3_v2.py
new file mode 100644
index 00000000..64b79715
--- /dev/null
+++ b/Week_01/id_3/recursion/783/LeetCode_783_3_v2.py
@@ -0,0 +1,16 @@
+class Solution:
+ def minDiffInBST(self, root) -> int:
+ # 取值2-100之间
+ self.diff = 100
+ self.last = -100
+
+ def dfs(node):
+ if not node:
+ return
+ dfs(node.left)
+ self.diff = min(self.diff, node.val-self.last)
+ self.last = node.val
+ dfs(node.right)
+
+ dfs(root)
+ return self.diff
diff --git a/Week_01/id_3/recursion/783/LeetCode_783_3_v3.py b/Week_01/id_3/recursion/783/LeetCode_783_3_v3.py
new file mode 100644
index 00000000..52a574a9
--- /dev/null
+++ b/Week_01/id_3/recursion/783/LeetCode_783_3_v3.py
@@ -0,0 +1,25 @@
+class Solution:
+ def minDiffInBST(self, root) -> int:
+ # 取值2-100之间
+ diff = 100
+ last = -100
+ stack = []
+ node = root
+ while stack or node:
+ if node.left:
+ stack.append(node)
+ node = node.left
+ continue
+
+ while stack or node:
+ diff = min(diff, node.val - last)
+ last = node.val
+ if node.right:
+ node = node.right
+ break
+ if stack:
+ node = stack.pop()
+ else:
+ node = None
+
+ return diff
diff --git a/Week_01/id_3/stack_queue/1021/LeetCode_1021_3_v1.py b/Week_01/id_3/stack_queue/1021/LeetCode_1021_3_v1.py
new file mode 100644
index 00000000..b653c38c
--- /dev/null
+++ b/Week_01/id_3/stack_queue/1021/LeetCode_1021_3_v1.py
@@ -0,0 +1,13 @@
+def remove_outer_parentheses(S):
+ stack = []
+ r = []
+ for c in S:
+ if c == '(':
+ stack.append(c)
+ if len(stack) != 1:
+ r.append(c)
+ else:
+ stack.pop()
+ if len(stack) != 0:
+ r.append(c)
+ return ''.join(r)
diff --git a/Week_01/id_3/stack_queue/1021/LeetCode_1021_3_v2.py b/Week_01/id_3/stack_queue/1021/LeetCode_1021_3_v2.py
new file mode 100644
index 00000000..19fd7b3e
--- /dev/null
+++ b/Week_01/id_3/stack_queue/1021/LeetCode_1021_3_v2.py
@@ -0,0 +1,13 @@
+def remove_outer_parentheses(S):
+ count = 0
+ r = []
+ for c in S:
+ if c == '(':
+ count += 1
+ if count != 1:
+ r.append(c)
+ else:
+ count -= 1
+ if count != 0:
+ r.append(c)
+ return ''.join(r)
diff --git a/Week_01/id_3/stack_queue/1021/test_1021.py b/Week_01/id_3/stack_queue/1021/test_1021.py
new file mode 100644
index 00000000..e1bf4cb7
--- /dev/null
+++ b/Week_01/id_3/stack_queue/1021/test_1021.py
@@ -0,0 +1,15 @@
+import lc_1021_v1
+import lc_1021_v2
+
+# f = lc_1021_v1.remove_outer_parentheses
+f = lc_1021_v2.remove_outer_parentheses
+
+
+def check(s, r):
+ _r = f(s)
+ print(_r, r, _r == r)
+
+
+check('(()())(())', '()()()')
+check('(()())(())(()(()))', '()()()()(())')
+check('()()', '')
diff --git a/Week_01/id_3/stack_queue/1047/LeetCode_1047_3_v1.py b/Week_01/id_3/stack_queue/1047/LeetCode_1047_3_v1.py
new file mode 100644
index 00000000..1a82b5d2
--- /dev/null
+++ b/Week_01/id_3/stack_queue/1047/LeetCode_1047_3_v1.py
@@ -0,0 +1,13 @@
+def remove_duplicates(S):
+ if not S:
+ return None
+ stack = [None]
+ for c in S:
+ if c == stack[-1]:
+ stack.pop()
+ else:
+ stack.append(c)
+ return ''.join(stack[1:])
+
+
+print(remove_duplicates('abbaca'), 'ca')
diff --git a/Week_01/id_30/LeetCode_101_030.cpp b/Week_01/id_30/LeetCode_101_030.cpp
new file mode 100644
index 00000000..ca3de0f6
--- /dev/null
+++ b/Week_01/id_30/LeetCode_101_030.cpp
@@ -0,0 +1,23 @@
+/**
+ * Definition for a binary tree node.
+ * struct TreeNode {
+ * int val;
+ * TreeNode *left;
+ * TreeNode *right;
+ * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
+ * };
+ */
+class Solution {
+public:
+ bool isSymmetric(TreeNode* root) {
+ if (root == nullptr) return true;
+ return CheckSymmetric(root->left, root->right);
+ }
+
+ bool CheckSymmetric(TreeNode* leftNode, TreeNode* rightNode)
+ {
+ if (leftNode && rightNode) return leftNode->val == rightNode->val && CheckSymmetric(leftNode->left, rightNode->right) && CheckSymmetric(leftNode->right, rightNode->left);
+ else if (leftNode == nullptr && rightNode == nullptr) return true;
+ else return false;
+ }
+};
\ No newline at end of file
diff --git a/Week_01/id_30/LeetCode_1047_030.cpp b/Week_01/id_30/LeetCode_1047_030.cpp
new file mode 100644
index 00000000..e1c922c1
--- /dev/null
+++ b/Week_01/id_30/LeetCode_1047_030.cpp
@@ -0,0 +1,19 @@
+class Solution {
+public:
+ string removeDuplicates(string S) {
+ string nonDuplicateString;
+ for (char c : S)
+ {
+ if (!nonDuplicateString.empty() && nonDuplicateString.back() == c)
+ {
+ nonDuplicateString.pop_back();
+ }
+ else
+ {
+ nonDuplicateString.push_back(c);
+ }
+ }
+
+ return nonDuplicateString;
+ }
+};
\ No newline at end of file
diff --git a/Week_01/id_30/LeetCode_104_030.cpp b/Week_01/id_30/LeetCode_104_030.cpp
new file mode 100644
index 00000000..91104ed2
--- /dev/null
+++ b/Week_01/id_30/LeetCode_104_030.cpp
@@ -0,0 +1,16 @@
+/**
+ * Definition for a binary tree node.
+ * struct TreeNode {
+ * int val;
+ * TreeNode *left;
+ * TreeNode *right;
+ * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
+ * };
+ */
+class Solution {
+public:
+ int maxDepth(TreeNode* root) {
+ if (root == nullptr) return 0;
+ else return max(maxDepth(root->left), maxDepth(root->right)) + 1;
+ }
+};
\ No newline at end of file
diff --git a/Week_01/id_30/LeetCode_111_030.cpp b/Week_01/id_30/LeetCode_111_030.cpp
new file mode 100644
index 00000000..dd84b4d5
--- /dev/null
+++ b/Week_01/id_30/LeetCode_111_030.cpp
@@ -0,0 +1,41 @@
+/**
+ * Definition for a binary tree node.
+ * struct TreeNode {
+ * int val;
+ * TreeNode *left;
+ * TreeNode *right;
+ * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
+ * };
+ */
+class Solution {
+public:
+ int minDepth(TreeNode* root) {
+ if(root == nullptr) return 0;
+ int leftDepth = -1;
+ if(root->left)
+ {
+ leftDepth = minDepth(root->left);
+ }
+ int rightDepth = -1;
+ if(root->right)
+ {
+ rightDepth = minDepth(root->right);
+ }
+ if(leftDepth == -1 && rightDepth == -1)
+ {
+ return 1;
+ }
+ if(leftDepth != -1 && rightDepth != -1)
+ {
+ return leftDepth < rightDepth ? leftDepth : rightDepth;
+ }
+ if(leftDepth != -1)
+ {
+ return leftDepth;
+ }
+ else
+ {
+ return rightDepth;
+ }
+ }
+};
\ No newline at end of file
diff --git a/Week_01/id_30/LeetCode_15_030.cpp b/Week_01/id_30/LeetCode_15_030.cpp
new file mode 100644
index 00000000..932678e0
--- /dev/null
+++ b/Week_01/id_30/LeetCode_15_030.cpp
@@ -0,0 +1,36 @@
+class Solution {
+public:
+ vector> groupAnagrams(String[] strs) {
+ Map
> groupAnagrams(String[] strs) {
+ Map
> res = new LinkedList<>();
+ for (int i = 0; i < num.length-2; i++) {
+ if (i == 0 || (i > 0 && num[i] != num[i-1])) {
+ int lo = i+1, hi = num.length-1, sum = 0 - num[i];
+ while (lo < hi) {
+ if (num[lo] + num[hi] == sum) {
+ res.add(Arrays.asList(num[i], num[lo], num[hi]));
+ while (lo < hi && num[lo] == num[lo+1]) lo++;
+ while (lo < hi && num[hi] == num[hi-1]) hi--;
+ lo++; hi--;
+ } else if (num[lo] + num[hi] < sum) lo++;
+ else hi--;
+ }
+ }
+ }
+ return res;
+ }
+}
\ No newline at end of file
diff --git "a/Week_01/id_37/\346\225\260\347\273\204\345\222\214\351\223\276\350\241\250/LeetCode_021_037.java" "b/Week_01/id_37/\346\225\260\347\273\204\345\222\214\351\223\276\350\241\250/LeetCode_021_037.java"
new file mode 100644
index 00000000..e59c57f4
--- /dev/null
+++ "b/Week_01/id_37/\346\225\260\347\273\204\345\222\214\351\223\276\350\241\250/LeetCode_021_037.java"
@@ -0,0 +1,34 @@
+class Solution {
+ public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
+ ListNode cur1=l1;
+ ListNode cur2=l2;
+ ListNode l3=new ListNode(0);
+ ListNode cur3=l3;
+ while(cur1!=null||cur2!=null){
+ if(cur1==null){
+ cur3.next=new ListNode(cur2.val);
+ cur3=cur3.next;
+ cur2=cur2.next;
+ continue;
+ }
+ if(cur2==null){
+ cur3.next=new ListNode(cur1.val);
+ cur3=cur3.next;
+ cur1=cur1.next;
+ continue;
+ }
+
+ if(cur1.val<=cur2.val){
+ cur3.next=new ListNode(cur1.val);
+ cur3=cur3.next;
+ cur1=cur1.next;
+
+ }else{
+ cur3.next=new ListNode(cur2.val);
+ cur3=cur3.next;
+ cur2=cur2.next;
+ }
+ }
+ return l3.next;
+ }
+}
\ No newline at end of file
diff --git "a/Week_01/id_37/\346\225\260\347\273\204\345\222\214\351\223\276\350\241\250/LeetCode_024_037.java" "b/Week_01/id_37/\346\225\260\347\273\204\345\222\214\351\223\276\350\241\250/LeetCode_024_037.java"
new file mode 100644
index 00000000..d8d4314a
--- /dev/null
+++ "b/Week_01/id_37/\346\225\260\347\273\204\345\222\214\351\223\276\350\241\250/LeetCode_024_037.java"
@@ -0,0 +1,25 @@
+public class Solution {
+ public ListNode swapPairs(ListNode head) {
+ ListNode dummyNode=new ListNode(0);
+ dummyNode.next=head;
+ ListNode p=dummyNode;
+ while(p.next!=null&&p.next.next!=null){
+ ListNode node1=p.next;
+ ListNode node2=node1.next;
+ ListNode next=node2.next;
+ node2.next=node1;
+ node1.next=next;
+ p.next=node2;
+ p=node1;
+ }
+ return dummyNode.next;
+ }
+
+ public static void main(String[] args) {
+ int[] nums={1,2,3,4,5};
+ ListNode list=new ListNode(nums);
+ System.out.println(list.toString());
+ ListNode listNode = new Solution().swapPairs(list);
+ System.out.println(listNode.toString());
+ }
+}
\ No newline at end of file
diff --git "a/Week_01/id_37/\346\225\260\347\273\204\345\222\214\351\223\276\350\241\250/LeetCode_026_037.java" "b/Week_01/id_37/\346\225\260\347\273\204\345\222\214\351\223\276\350\241\250/LeetCode_026_037.java"
new file mode 100644
index 00000000..ce6eb4ab
--- /dev/null
+++ "b/Week_01/id_37/\346\225\260\347\273\204\345\222\214\351\223\276\350\241\250/LeetCode_026_037.java"
@@ -0,0 +1,25 @@
+public class Solution {
+ public int removeDuplicates(int[] nums) {
+ if(nums.length==0){
+ return 0;
+ }
+ int k=0;//[0,k]保存所有合法的非重复数字
+ int c=nums[0];//当前比较的数字
+ for(int i=1;i
> threeSum(int[] nums) {
+ if (nums.length < 3) return null;
+ Arrays.sort(nums);
+
+ List
> result = new ArrayList<>();
+
+ if (nums[0] <= 0 && nums[nums.length - 1] >= 0) {
+ for (int i = 0; i < nums.length - 2; ++i) {
+ if (i > 0 && nums[i-1] == nums[i]) continue;
+
+ int l = i +1, r = nums.length - 1;
+ while(l < r){
+ if(nums[r] > -nums[i]-nums[l]){
+ while(l < r && nums[r-1] == nums[r]) r--;
+ r--;
+ }
+ else if(nums[r] < -nums[i]-nums[l]){
+ while(l < r && nums[l+1] == nums[l]) l++;
+ l++;
+ }
+ else{
+ result.add(Arrays.asList(nums[i],nums[l],nums[r]));
+ while(l < r && nums[r-1] == nums[r]) r--;
+ while(l < r && nums[l+1] == nums[l]) l++;
+ r--;
+ l++;
+ }
+ }
+ }
+ }
+
+ return result;
+ }
+
+ public static void main(String[] args) {
+ LeetCode_15_038 testCode_15_038 = new LeetCode_15_038();
+ int[] nums = new int[]{-1,0,1,2,-1,-4};
+ System.out.println(testCode_15_038.threeSum(nums));
+ }
+}
+
diff --git a/Week_01/id_38/LeetCode_242_038.java b/Week_01/id_38/LeetCode_242_038.java
new file mode 100644
index 00000000..80b73725
--- /dev/null
+++ b/Week_01/id_38/LeetCode_242_038.java
@@ -0,0 +1,30 @@
+/*
+ * @lc app=leetcode.cn id=242 lang=java
+ *
+ * [242] 有效的字母异位词
+ * 要点1:答案中不包含重复的三元组
+ */
+class LeetCode_242_038 {
+
+ public boolean isAnagram(String s, String t) {
+ if (s.length() != t.length()) return false;
+
+ int[] hash = new int[26];
+ for(int i = 0; i < s.length(); ++i) {
+ hash[s.charAt(i) - 'a']++;
+ hash[t.charAt(i) - 'a']--;
+ }
+
+ for (int i = 0; i < hash.length; ++i) {
+ if (hash[i] != 0) return false;
+ }
+
+ return true;
+ }
+
+ public static void main(String[] args) {
+ LeetCode_242_038 testCode_242_038 = new LeetCode_242_038();
+ System.out.println(testCode_242_038.isAnagram("aaab", "baaa"));
+ }
+}
+
diff --git a/Week_01/id_38/LeetCode_26_038.java b/Week_01/id_38/LeetCode_26_038.java
new file mode 100644
index 00000000..b2b73cf1
--- /dev/null
+++ b/Week_01/id_38/LeetCode_26_038.java
@@ -0,0 +1,37 @@
+/*
+ * @lc app=leetcode.cn id=26 lang=java
+ *
+ * [26] 删除排序数组中的重复项
+ * 要点1:有序数组
+ * 要点2:原地删除
+ */
+class LeetCode_26_038 {
+
+ /**
+ * 时间复杂度:O(n)
+ * 空间复杂度:不需要额外空间
+ * @param nums
+ * @return
+ */
+ public int removeDuplicates(int[] nums) {
+ // check valid
+ if (nums.length == 0) return 0;
+
+ // process
+ int i = 0;
+ for (int j = 1; j < nums.length; ++j){
+ if (nums[i] != nums[j]) {
+ i++;
+ nums[i] = nums[j];
+ }
+ }
+ return i + 1;
+ }
+
+ public static void main(String[] args) {
+ LeetCode_26_038 testCode_26_038 = new LeetCode_26_038();
+ int[] nums = new int[]{1, 1, 2, 2, 4, 5, 7};
+ System.out.println(testCode_26_038.removeDuplicates(nums));
+ }
+}
+
diff --git a/Week_01/id_38/LeetCode_50_038.java b/Week_01/id_38/LeetCode_50_038.java
new file mode 100644
index 00000000..5e049036
--- /dev/null
+++ b/Week_01/id_38/LeetCode_50_038.java
@@ -0,0 +1,27 @@
+/*
+ * @lc app=leetcode.cn id=50 lang=java
+ *
+ * [50] Pow(x, n)
+ */
+class LeetCode_50_038 {
+ public double myPow(double x, int n) {
+ if (n == 0) return 1.0;
+
+ double half = myPow(x, n / 2);
+
+
+ // 建议这里直接return三目运算符
+ if (n % 2 == 0) {
+ return half * half;
+ } else {
+ return half * half * x;
+ }
+
+ }
+
+ public static void main(String[] args) {
+ LeetCode_50_038 testCode_50_038 = new LeetCode_50_038();
+ System.out.println(testCode_50_038.myPow(2, 10));
+ }
+}
+
diff --git a/Week_01/id_38/NOTE.md b/Week_01/id_38/NOTE.md
index 107ea7d6..7df033ab 100644
--- a/Week_01/id_38/NOTE.md
+++ b/Week_01/id_38/NOTE.md
@@ -1 +1,3 @@
# 学习笔记
+
+Chao:代码逻辑非常清晰和简洁,继续保持和多练习其他题目。多看 leetcode 中文版的题解和国际版上的discuss高票代码。
\ No newline at end of file
diff --git a/Week_01/id_38/README.md b/Week_01/id_38/README.md
new file mode 100644
index 00000000..69b0ff78
--- /dev/null
+++ b/Week_01/id_38/README.md
@@ -0,0 +1,64 @@
+# 学习笔记
+
+## 第一周题目
+---
+### 数组、链表
+* [x] 【简单】[26. 删除排序数组中的重复项 ](https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/)
+
+* [ ] 【简单】[189. 旋转数组](https://leetcode-cn.com/problems/rotate-array/)
+
+* [ ] 【简单】[21. 合并两个有序链表](https://leetcode-cn.com/problems/merge-two-sorted-lists/)
+
+* [ ] 【简单】[88. 合并两个有序数组](https://leetcode-cn.com/problems/merge-sorted-array/)
+
+* [ ] 【中等】[24. 两两交换链表中的节点](https://leetcode-cn.com/problems/swap-nodes-in-pairs/)
+
+* [x] 【中等】[15. 三数之和](https://leetcode-cn.com/problems/3sum/)
+
+---
+
+### Map & Set
+* [x] [242. 有效的字母异位词【简单】](https://leetcode-cn.com/problems/valid-anagram/)
+
+* [ ] [49. 字母异位词分组【中等】](https://leetcode-cn.com/problems/group-anagrams/)
+
+---
+
+### 堆栈、队列
+
+* [ ] [1047. 删除字符串中的所有相邻重复项【简单】](https://leetcode-cn.com/problems/remove-all-adjacent-duplicates-in-string/)
+
+* [ ] [1021. 删除最外层的括号【简单】](https://leetcode-cn.com/problems/remove-outermost-parentheses/)
+
+* [ ] [84. 柱状图中最大的矩形【困难】](https://leetcode.com/problems/largest-rectangle-in-histogram/)
+
+* [ ] [42. 接雨水【困难】](https://leetcode.com/problems/trapping-rain-water/)
+
+---
+
+### 二分查找
+
+* [ ] [441. 排列硬币【简单】](https://leetcode-cn.com/problems/arranging-coins/)
+
+* [x] [50. Pow(x, n)【中等】](https://leetcode-cn.com/problems/powx-n/)
+
+* [ ] [174. 地下城游戏【困难】](https://leetcode-cn.com/problems/dungeon-game/)
+
+
+---
+
+### 递归
+
+* [ ] [104. 二叉树的最大深度【简单】](https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/)
+
+* [ ] [101. 对称二叉树【简单】](https://leetcode-cn.com/problems/symmetric-tree/)
+
+* [ ] [111. 二叉树的最小深度【简单】](https://leetcode-cn.com/problems/minimum-depth-of-binary-tree/)
+
+* [ ] [783. 二叉搜索树结点最小距离【简单】](https://leetcode-cn.com/problems/minimum-distance-between-bst-nodes/)
+
+* [ ] [257. 二叉树的所有路径【简单】](https://leetcode-cn.com/problems/binary-tree-paths/)
+
+* [ ] [938. 二叉搜索树的范围和【简单】](https://leetcode-cn.com/problems/range-sum-of-bst/)
+
+* [ ] [236. 二叉树的最近公共祖先【中等】](https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree/)
diff --git "a/Week_01/id_38/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225\346\200\273\347\273\223.xmind" "b/Week_01/id_38/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225\346\200\273\347\273\223.xmind"
new file mode 100644
index 00000000..13ad0407
Binary files /dev/null and "b/Week_01/id_38/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225\346\200\273\347\273\223.xmind" differ
diff --git a/Week_01/id_39/LeetCode_101_39.js b/Week_01/id_39/LeetCode_101_39.js
new file mode 100644
index 00000000..b1c567b9
--- /dev/null
+++ b/Week_01/id_39/LeetCode_101_39.js
@@ -0,0 +1,32 @@
+/**
+ * Definition for a binary tree node.
+ * function TreeNode(val) {
+ * this.val = val;
+ * this.left = this.right = null;
+ * }
+ */
+/**
+ * @param {TreeNode} root
+ * @return {boolean}
+ * https://leetcode.com/problems/symmetric-tree/
+ */
+
+// 递归法
+var treeSymmetric = function(t1, t2) {
+ if (t1 == null || t2 == null) {
+ return t1 == t2;
+ }
+ if (t1.val !== t2.val) {
+ return false;
+ }
+ return treeSymmetric(t1.left, t2.right) && treeSymmetric(t1.right, t2.left);
+};
+var isSymmetric = function(root) {
+ if (!root) {
+ return true;
+ }
+ return treeSymmetric(root.left, root.right);
+};
+
+
+// 迭代法
\ No newline at end of file
diff --git a/Week_01/id_39/LeetCode_1021_39.js b/Week_01/id_39/LeetCode_1021_39.js
new file mode 100644
index 00000000..aff8cbc1
--- /dev/null
+++ b/Week_01/id_39/LeetCode_1021_39.js
@@ -0,0 +1,21 @@
+/**
+ * @param {string} S
+ * @return {string}
+ * https://leetcode.com/problems/remove-outermost-parentheses/
+ * 标志位,刨除标志位为0的时候,其余时候都移到结果中
+ */
+var removeOuterParentheses = function(S) {
+ let sign = 0;
+ let result = '';
+ let i = 0;
+ while (i < S.length) {
+ let cur = S.charAt(i);
+ if (cur === '(' && sign++ > 0) {
+ result += cur;
+ } else if (cur === ')' && sign-- > 1) {
+ result += cur;
+ }
+ i++;
+ }
+ return result;
+};
diff --git a/Week_01/id_39/LeetCode_1047_39.js b/Week_01/id_39/LeetCode_1047_39.js
new file mode 100644
index 00000000..f454ab00
--- /dev/null
+++ b/Week_01/id_39/LeetCode_1047_39.js
@@ -0,0 +1,21 @@
+/**
+ * @param {string} S
+ * @return {string}
+ * https://leetcode.com/problems/remove-all-adjacent-duplicates-in-string/
+ */
+var removeDuplicates = function(S) {
+ let arr = S.split('');
+ let stack = [];
+ for (let j = 0; j < arr.length; j++) {
+ if (!stack.length) {
+ stack.push(arr[j]);
+ continue;
+ }
+ let prev = stack.pop();
+ if (arr[j] !== prev) {
+ stack.push(prev);
+ stack.push(arr[j]);
+ }
+ }
+ return stack.join('');
+};
\ No newline at end of file
diff --git a/Week_01/id_39/LeetCode_104_39.js b/Week_01/id_39/LeetCode_104_39.js
new file mode 100644
index 00000000..8bcb7db7
--- /dev/null
+++ b/Week_01/id_39/LeetCode_104_39.js
@@ -0,0 +1,55 @@
+/**
+ * Definition for a binary tree node.
+ * function TreeNode(val) {
+ * this.val = val;
+ * this.left = this.right = null;
+ * }
+ */
+/**
+ * @param {TreeNode} root
+ * @return {number}
+ * https://leetcode.com/problems/maximum-depth-of-binary-tree/
+ */
+// 广度优先搜索
+var maxDepth = function(root) {
+ if (!root) {
+ return 0;
+ }
+
+ let queue = [];
+ let level = [root];
+ let depth = 0;
+
+ while (level.length) {
+ depth++;
+
+ while (level.length) {
+ let node = level.shift();
+ if (node.left) {
+ queue.push(node.left);
+ }
+ if (node.right) {
+ queue.push(node.right);
+ }
+ }
+ level = queue;
+ queue = [];
+ }
+
+ return depth;
+};
+
+// DFS 深度优先搜索 递归形式
+var maxDepth = function(root) {
+ if (!root) {
+ return 0;
+ }
+ return Math.max(maxDepth(root.left) + 1, maxDepth(root.right) + 1);
+};
+
+// DFS 深度优先搜索 非递归形式
+var maxDepth = function(root) {
+ if (!root) {
+ return 0;
+ }
+};
diff --git a/Week_01/id_39/LeetCode_111_39.js b/Week_01/id_39/LeetCode_111_39.js
new file mode 100644
index 00000000..f85507a6
--- /dev/null
+++ b/Week_01/id_39/LeetCode_111_39.js
@@ -0,0 +1,25 @@
+/**
+ * Definition for a binary tree node.
+ * function TreeNode(val) {
+ * this.val = val;
+ * this.left = this.right = null;
+ * }
+ */
+/**
+ * @param {TreeNode} root
+ * @return {number}
+ * https://leetcode.com/problems/minimum-depth-of-binary-tree/
+ * 注意:最小深度是根节点到叶子节点,so 如果只有根节点和它都某一子节点,则深度为2
+ */
+
+var minDepth = function(root) {
+ if (!root) {
+ return 0;
+ }
+ let left = minDepth(root.left);
+ let right = minDepth(root.right);
+ if (left == 0 || right == 0) {
+ return left + right + 1;
+ }
+ return Math.min(left, right) + 1;
+};
diff --git a/Week_01/id_39/LeetCode_141_39.js b/Week_01/id_39/LeetCode_141_39.js
new file mode 100644
index 00000000..9acc19aa
--- /dev/null
+++ b/Week_01/id_39/LeetCode_141_39.js
@@ -0,0 +1,56 @@
+/**
+ * Definition for a binary tree node.
+ * function TreeNode(val) {
+ * this.val = val;
+ * this.left = this.right = null;
+ * }
+ */
+/**
+ * @param {TreeNode} root
+ * @return {number}
+ * https://leetcode.com/problems/maximum-depth-of-binary-tree/
+ */
+// 广度优先搜索
+var maxDepth = function(root) {
+ if (!root) {
+ return 0;
+ }
+
+ let queue = [];
+ let level = [root];
+ let depth = 0;
+
+ while (level.length) {
+ depth++;
+
+ while (level.length) {
+ let node = level.shift();
+ if (node.left) {
+ queue.push(node.left);
+ }
+ if (node.right) {
+ queue.push(node.right);
+ }
+ }
+ level = queue;
+ queue = [];
+ }
+
+ return depth;
+};
+
+// DFS 深度优先搜索 递归形式
+var maxDepth = function(root) {
+ if (!root) {
+ return 0;
+ }
+ return Math.max(maxDepth(root.left) + 1, maxDepth(root.right) + 1);
+};
+
+// DFS 深度优先搜索 非递归形式
+var maxDepth = function(root) {
+ if (!root) {
+ return 0;
+ }
+ //
+};
diff --git a/Week_01/id_39/LeetCode_15_39.js b/Week_01/id_39/LeetCode_15_39.js
new file mode 100644
index 00000000..adb96e45
--- /dev/null
+++ b/Week_01/id_39/LeetCode_15_39.js
@@ -0,0 +1,52 @@
+/**
+ * @param {number[]} nums
+ * @return {number[][]}
+ * https://leetcode.com/problems/3sum/
+ * 备注:这一版太乱了, 内存性能都非常差!!!
+ */
+
+var threeSum = function(arrs) {
+ if (arrs.length < 3) {
+ return [];
+ }
+ let nums = [];
+ let map = new Map();
+ for (let i = 0; i < arrs.length; i++) {
+ let cur = arrs[i];
+ if (map.has(cur)) {
+ let count = map.get(cur);
+ if (count < 3) {
+ map.set(cur, count + 1);
+ nums.push(cur);
+ }
+ } else {
+ map.set(cur, 1);
+ nums.push(cur);
+ }
+ }
+ // nums = temps;
+ let result = new Set();
+ for (let i = 0; i < nums.length; i++) {
+ for (let j = 0; j < nums.length; j++) {
+ let a = nums[i];
+ let b = nums[j];
+ let c = (-1) * (a + b);
+ if (map.has(c)) {
+ if ((a == b && b == c && c == a) && map.get(a) < 3) {
+ continue;
+ }
+ if ((a == b || a == c) && map.get(a) < 2) {
+ continue;
+ }
+ if (b == c && map.get(b) < 2) {
+ continue;
+ }
+ let arr = [a, b, c].sort().join(',');
+ result.add(arr);
+ }
+ }
+ }
+ return Array.from(result, (val) => {
+ return val.split(',')
+ });
+};
\ No newline at end of file
diff --git a/Week_01/id_39/LeetCode_189_39.js b/Week_01/id_39/LeetCode_189_39.js
new file mode 100644
index 00000000..7ff4e78d
--- /dev/null
+++ b/Week_01/id_39/LeetCode_189_39.js
@@ -0,0 +1,26 @@
+/**
+ * @param {number[]} nums
+ * @param {number} k
+ * @return {void} Do not return anything, modify nums in-place instead.
+ * https://leetcode.com/problems/rotate-array/
+ * 思路:比较难想,3次reverse
+ * tips: 3种不同思路
+ */
+var reverse = function(nums, i, j) {
+ while(i < j) {
+ temp = nums[i];
+ nums[i] = nums[j];
+ nums[j] = temp
+ i++;
+ j--;
+ }
+}
+
+var rotate = function(nums, k) {
+ let len = nums.length;
+ k %= len;
+
+ reverse(nums, 0, len - k - 1);
+ reverse(nums, len - k, len - 1);
+ reverse(nums, 0, len - 1);
+};
\ No newline at end of file
diff --git a/Week_01/id_39/LeetCode_21_39.js b/Week_01/id_39/LeetCode_21_39.js
new file mode 100644
index 00000000..b4a972d8
--- /dev/null
+++ b/Week_01/id_39/LeetCode_21_39.js
@@ -0,0 +1,43 @@
+/**
+ * Definition for singly-linked list.
+ * function ListNode(val) {
+ * this.val = val;
+ * this.next = null;
+ * }
+ */
+/**
+ * @param {ListNode} l1
+ * @param {ListNode} l2
+ * @return {ListNode}
+ * https://leetcode.com/problems/merge-two-sorted-lists/
+ * 思路:新建一个链表,头指针是一个哨兵位,遍历两个链表,比较大小,小的在前,并指针移到下一位
+ */
+
+function ListNode(val) {
+ this.val = val;
+ this.next = null;
+}
+
+var mergeTwoLists = function(l1, l2) {
+ if (!l1 && !l2) {
+ return null;
+ }
+ let head = new ListNode(null);
+ let cur1 = l1;
+ let cur2 = l2;
+ let cur = head;
+ while(cur1 || cur2) {
+ if ((cur1 && !cur2) || (cur1 && cur2 && (cur2.val > cur1.val))) {
+ cur.next = new ListNode(cur1.val);
+ cur = cur.next;
+ cur1 = cur1.next;
+ continue;
+ } else {
+ cur.next = new ListNode(cur2.val);
+ cur = cur.next;
+ cur2 = cur2.next;
+ continue;
+ }
+ }
+ return head.next;
+};
\ No newline at end of file
diff --git a/Week_01/id_39/LeetCode_236_39.js b/Week_01/id_39/LeetCode_236_39.js
new file mode 100644
index 00000000..6650210a
--- /dev/null
+++ b/Week_01/id_39/LeetCode_236_39.js
@@ -0,0 +1,25 @@
+/**
+ * Definition for a binary tree node.
+ * function TreeNode(val) {
+ * this.val = val;
+ * this.left = this.right = null;
+ * }
+ */
+/**
+ * @param {TreeNode} root
+ * @param {TreeNode} p
+ * @param {TreeNode} q
+ * @return {TreeNode}
+ * https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree/
+ */
+
+// 分别在左右子树查找p或者q,找到了就返回
+var lowestCommonAncestor = function(root, p, q) {
+ if (!root || root == p || root == q) {
+ return root;
+ }
+ let left = lowestCommonAncestor(root.left, p, q);
+ let right = lowestCommonAncestor(root.right, p, q);
+
+ return left == null ? right : right == null ? left : root;
+};
diff --git a/Week_01/id_39/LeetCode_242_39.js b/Week_01/id_39/LeetCode_242_39.js
new file mode 100644
index 00000000..95a60633
--- /dev/null
+++ b/Week_01/id_39/LeetCode_242_39.js
@@ -0,0 +1,38 @@
+/**
+ * @param {string} s
+ * @param {string} t
+ * @return {boolean}
+ * https://leetcode.com/problems/valid-anagram/
+ * 思路:一个map、len做加减,比较两个是否一样;
+ * 也可以排序做(nLogN)
+ */
+var isAnagram = function(s, t) {
+ let sArr = s.split('');
+ let tArr = t.split('');
+ let map = {};
+ let len = 0;
+ for (let i = 0; i < sArr.length; i++) {
+ let cur = sArr[i];
+ if (map[cur]) {
+ map[cur] = map[cur] + 1;
+ } else {
+ map[cur] = 1;
+ len++;
+ }
+ }
+ for (let i = 0; i < tArr.length; i++) {
+ let cur = tArr[i];
+ if (map[cur]) {
+ map[cur] = map[cur] - 1;
+ if (map[cur] === 0) {
+ len--;
+ }
+ if (map[cur] < 0) {
+ return false;
+ }
+ } else {
+ return false;
+ }
+ }
+ return len === 0 ? true : false;
+};
diff --git a/Week_01/id_39/LeetCode_24_39.js b/Week_01/id_39/LeetCode_24_39.js
new file mode 100644
index 00000000..26ac99bd
--- /dev/null
+++ b/Week_01/id_39/LeetCode_24_39.js
@@ -0,0 +1,34 @@
+/**
+ * Definition for singly-linked list.
+ * function ListNode(val) {
+ * this.val = val;
+ * this.next = null;
+ * }
+ */
+/**
+ * @param {ListNode} head
+ * @return {ListNode}
+ * https://leetcode.com/problems/swap-nodes-in-pairs/
+ * 思路:画图!!! 偶数项指向奇数项,第一个奇数项指向下一个偶数项,如若不存在则指向奇数项,都不存在指向null(重要!!!防止循环引用);
+ */
+var swapPairs = function(head) {
+ if (!head || !head.next) {
+ return head;
+ }
+ let res = head.next;
+ let odd = head;
+ let even = odd.next;
+ while(odd && even) {
+ let nextOdd = even.next;
+ even.next = odd;
+ if (nextOdd) {
+ odd.next = nextOdd.next ? nextOdd.next : nextOdd;
+ odd = nextOdd;
+ even = nextOdd.next;
+ } else {
+ odd.next = nextOdd
+ break;
+ }
+ }
+ return res;
+ };
\ No newline at end of file
diff --git a/Week_01/id_39/LeetCode_257_39.js b/Week_01/id_39/LeetCode_257_39.js
new file mode 100644
index 00000000..89977952
--- /dev/null
+++ b/Week_01/id_39/LeetCode_257_39.js
@@ -0,0 +1,35 @@
+/**
+ * Definition for a binary tree node.
+ * function TreeNode(val) {
+ * this.val = val;
+ * this.left = this.right = null;
+ * }
+ */
+/**
+ * @param {TreeNode} root
+ * @return {string[]}
+ * https://leetcode.com/problems/binary-tree-paths/submissions/
+ */
+var traverse = function(root, path, result) {
+ if (!root.left && !root.right) {
+ result.push(path + root.val);
+ return;
+ }
+ path = path + root.val + '->';
+
+ if (root.left) {
+ traverse(root.left, path, result);
+ }
+ if (root.right) {
+ traverse(root.right, path, result);
+ }
+};
+
+var binaryTreePaths = function(root) {
+ if (!root) {
+ return [];
+ }
+ let result = [];
+ traverse(root, '', result);
+ return result;
+};
diff --git a/Week_01/id_39/LeetCode_26_39.js b/Week_01/id_39/LeetCode_26_39.js
new file mode 100644
index 00000000..0a19a4d4
--- /dev/null
+++ b/Week_01/id_39/LeetCode_26_39.js
@@ -0,0 +1,26 @@
+/**
+ * @param {number[]} nums
+ * @return {number}
+ * https://leetcode.com/problems/remove-duplicates-from-sorted-array/
+ * 思路:对比前后两个数据,如果不相等,则把后面一个和起始第一个不重复位置的后一个交换
+ */
+var swap = function(arr, i, j) {
+ let temp = arr[i];
+ arr[i] = arr[j];
+ arr[j] = temp;
+}
+var removeDuplicates = function(nums) {
+ // 起始第一个不重复的点
+ let notRepeat = 1;
+ let max = nums[0];
+ let i = 1;
+ while(i < nums.length) {
+ if (nums[i] !== nums[i-1] && nums[i] > max) {
+ max = nums[i];
+ swap(nums, notRepeat, i);
+ notRepeat++
+ }
+ i++;
+ }
+ return notRepeat;
+};
\ No newline at end of file
diff --git a/Week_01/id_39/LeetCode_441_39.js b/Week_01/id_39/LeetCode_441_39.js
new file mode 100644
index 00000000..fd20250a
--- /dev/null
+++ b/Week_01/id_39/LeetCode_441_39.js
@@ -0,0 +1,33 @@
+/**
+ * @param {number} n
+ * @return {number}
+ * 未使用二分查找
+ * https://leetcode.com/problems/arranging-coins/
+ */
+var arrangeCoins = function(n) {
+ let l = 1;
+ let max = 0;
+ while (true) {
+ n = n - l;
+ l++;
+ if (n < 0) {
+ break;
+ }
+ max++;
+ }
+ return max;
+};
+
+var arrangeCoins = function(n) {
+ let l = 1;
+ let max = 0;
+ while (true) {
+ n = n - l;
+ l++;
+ if (n < 0) {
+ break;
+ }
+ max++;
+ }
+ return max;
+};
\ No newline at end of file
diff --git a/Week_01/id_39/LeetCode_49_39.js b/Week_01/id_39/LeetCode_49_39.js
new file mode 100644
index 00000000..363a06c6
--- /dev/null
+++ b/Week_01/id_39/LeetCode_49_39.js
@@ -0,0 +1,26 @@
+/**
+ * @param {string[]} strs
+ * @return {string[][]}
+ * https://leetcode.com/problems/group-anagrams/
+ * 空间换时间
+ */
+var groupAnagrams = function(strs) {
+ let temp = {};
+ let result = [];
+ let groupId = 0;
+ for (let i = 0; i < strs.length; i++) {
+ let sorted = strs[i]
+ .split('')
+ .sort()
+ .join('');
+ if (!temp[sorted] && temp[sorted] != 0) {
+ temp[sorted] = groupId;
+ groupId++;
+ }
+ if (!result[temp[sorted]]) {
+ result[temp[sorted]] = [];
+ }
+ result[temp[sorted]].push(strs[i]);
+ }
+ return result;
+};
diff --git a/Week_01/id_39/LeetCode_50_39.js b/Week_01/id_39/LeetCode_50_39.js
new file mode 100644
index 00000000..0a47f0ea
--- /dev/null
+++ b/Week_01/id_39/LeetCode_50_39.js
@@ -0,0 +1,22 @@
+/**
+ * @param {number} x
+ * @param {number} n
+ * @return {number}
+ * https://leetcode.com/problems/powx-n/
+ * 分治法(递归), 不用递归的一种还没理解
+ */
+var myPow = function(x, n) {
+ if (n === 0) {
+ return 1;
+ }
+ if (n === 1) {
+ return x;
+ }
+ if (n < 0) {
+ return 1 / myPow(x, -n);
+ }
+ if (n % 2 === 1) {
+ return x * myPow(x * x, (n - 1) / 2);
+ }
+ return myPow(x * x, n / 2);
+};
diff --git a/Week_01/id_39/LeetCode_84_39.js b/Week_01/id_39/LeetCode_84_39.js
new file mode 100644
index 00000000..e161bb53
--- /dev/null
+++ b/Week_01/id_39/LeetCode_84_39.js
@@ -0,0 +1,25 @@
+/**
+ * @param {number[]} heights
+ * @return {number}
+ * 目前只能理解暴力法。。。另一种单调栈的等理解之后添加
+ */
+// 暴力法,计算每一种的可能 O(n^2)
+var largestRectangleArea = function(heights) {
+ if (!heights.length) {
+ return 0;
+ }
+ let maxArea = 0;
+ for (let i = 0; i < heights.length; i++) {
+ let min = heights[i];
+ for (let j = i; j < heights.length; j++) {
+ if (heights[j] < min) {
+ min = heights[j];
+ }
+ let area = (j - i + 1) * min;
+ if (area > maxArea) {
+ maxArea = area;
+ }
+ }
+ }
+ return maxArea;
+};
diff --git a/Week_01/id_39/LeetCode_88_39.js b/Week_01/id_39/LeetCode_88_39.js
new file mode 100644
index 00000000..ac1509f7
--- /dev/null
+++ b/Week_01/id_39/LeetCode_88_39.js
@@ -0,0 +1,20 @@
+/**
+ * @param {number[]} nums1
+ * @param {number} m
+ * @param {number[]} nums2
+ * @param {number} n
+ * @return {void} Do not return anything, modify nums1 in-place instead.
+ * https://leetcode.com/problems/merge-sorted-array/
+ */
+var merge = function(nums1, m, nums2, n) {
+ let last = m + n - 1;
+ m--;
+ n--;
+ while (m >= 0 || n >= 0) {
+ if (nums2[n] > nums1[m] || m < 0) {
+ nums1[last--] = nums2[n--];
+ } else {
+ nums1[last--] = nums1[m--];
+ }
+ }
+};
\ No newline at end of file
diff --git a/Week_01/id_39/NOTE.md b/Week_01/id_39/NOTE.md
index 107ea7d6..6508539d 100644
--- a/Week_01/id_39/NOTE.md
+++ b/Week_01/id_39/NOTE.md
@@ -1 +1,4 @@
# 学习笔记
+
+
+Chao:代码清晰简洁好看,继续保持。看到你对于有点算法不是很理解,这个不用着急,多练习同时多反复即可。
\ No newline at end of file
diff --git "a/Week_01/id_39/\347\256\227\346\263\225\344\270\216\346\225\260\346\215\256\347\273\223\346\236\204.png" "b/Week_01/id_39/\347\256\227\346\263\225\344\270\216\346\225\260\346\215\256\347\273\223\346\236\204.png"
new file mode 100644
index 00000000..9a78481d
Binary files /dev/null and "b/Week_01/id_39/\347\256\227\346\263\225\344\270\216\346\225\260\346\215\256\347\273\223\346\236\204.png" differ
diff --git a/Week_01/id_40/LeetCode_24_40.cpp b/Week_01/id_40/LeetCode_24_40.cpp
new file mode 100644
index 00000000..92b5f70a
--- /dev/null
+++ b/Week_01/id_40/LeetCode_24_40.cpp
@@ -0,0 +1,60 @@
+/*
+ * @lc app=leetcode id=24 lang=cpp
+ *
+ * [24] Swap Nodes in Pairs
+ */
+/**
+ * Definition for singly-linked list.
+ * struct ListNode {
+ * int val;
+ * ListNode *next;
+ * ListNode(int x) : val(x), next(NULL) {}
+ * };
+ */
+
+/*用递归的方法来解题
+class Solution {
+public:
+ ListNode* swapPairs(ListNode* head) {
+ if(head == nullptr || head->next == nullptr) {
+ return head;
+ }
+
+ ListNode* pTempHead = head;
+ ListNode* pTempNext = pTempHead->next;
+
+ pTempHead->next = swapPairs(pTempNext->next);
+ pTempNext->next = pTempHead;
+
+ return pTempNext;
+ }
+};
+*/
+/*直接法--交换相邻的两个节点*/
+class Solution {
+public:
+ ListNode* swapPairs(ListNode* head) {
+ if (head == nullptr || head->next == nullptr) {
+ return head;
+ }
+
+ ListNode tempNode(-1);
+ tempNode.next = head;
+ ListNode* p = &tempNode;
+ ListNode* p1 = nullptr;
+ ListNode* p2 = nullptr;
+ while(p->next && p->next->next){
+ p1 = p->next;
+ p2 = p1->next;
+
+ p1->next = p2->next;
+ p2->next = p1;
+ p->next = p2;
+
+ p = p1;
+ }
+ return tempNode.next;
+ }
+};
+
+
diff --git a/Week_01/id_40/LeetCode_49_40.cpp b/Week_01/id_40/LeetCode_49_40.cpp
new file mode 100644
index 00000000..a564408d
--- /dev/null
+++ b/Week_01/id_40/LeetCode_49_40.cpp
@@ -0,0 +1,33 @@
+/*
+ * @lc app=leetcode id=49 lang=cpp
+ *
+ * [49] Group Anagrams
+ */
+/*将每一个字符串排序之后放进哈希表中
+ 遍历哈希表,将结果放进返回中
+*/
+class Solution {
+public:
+ vector
> threeSum(int[] nums) {
+ Arrays.sort(nums);
+ List
> lists = new ArrayList<>();
+ int length = nums.length;
+ for (int i = 0; i < length - 2; i++) {
+ if (i != 0 && nums[i] == nums[i - 1])
+ continue;
+ if(nums[i]>0)
+ break;
+ int first = i + 1;
+ int last = length - 1;
+ while (first < last) {
+ int sum = nums[i] + nums[first] + nums[last];
+ if (sum == 0) {
+ lists.add(Arrays.asList(nums[i], nums[first], nums[last]));
+ first++;
+ last--;
+ while (first < last && nums[first] == nums[first - 1])
+ first++;
+ while (first < last && nums[last] == nums[last + 1])
+ last--;
+ } else if (sum > 0&&first
+
+
+
+
+
+
+
+ > list = new BinaryTreeLevelorderTraversal102().levelOrder(node);
+ for (List
> levelOrder(TreeNode root) {
+ List
> list = new LinkedList<>();
+ if (root == null) return list;
+ Queue
> list = new BinaryTreeZigzagLevelOrderTraversal103().zigzagLevelOrder(node);
+ for (List
> zigzagLevelOrder(TreeNode root) {
+ List
> list = new LinkedList<>();
+ if (root == null) return list;
+ Queue
> zigzagLevelOrder2(TreeNode root) {
+ List
> list = new LinkedList<>();
+ if (root == null) return list;
+ Queue