From 400a2e50aa5112a57f7591bdb0f745d7e2fd93c8 Mon Sep 17 00:00:00 2001 From: yujingwen Date: Wed, 5 Jun 2019 03:17:25 +0800 Subject: [PATCH 01/75] init & 26 && 189 --- Week_01/id_3/array/189/lc_189_v1.py | 10 ++++++++++ Week_01/id_3/array/189/test.py | 12 ++++++++++++ Week_01/id_3/array/26/lc_26_v1.py | 12 ++++++++++++ Week_01/id_3/array/26/test.py | 12 ++++++++++++ 4 files changed, 46 insertions(+) create mode 100644 Week_01/id_3/array/189/lc_189_v1.py create mode 100644 Week_01/id_3/array/189/test.py create mode 100644 Week_01/id_3/array/26/lc_26_v1.py create mode 100644 Week_01/id_3/array/26/test.py diff --git a/Week_01/id_3/array/189/lc_189_v1.py b/Week_01/id_3/array/189/lc_189_v1.py new file mode 100644 index 00000000..f79a9401 --- /dev/null +++ b/Week_01/id_3/array/189/lc_189_v1.py @@ -0,0 +1,10 @@ +def rotate(nums, k): + if not nums: + return + + last_index = len(nums) - 1 + for t in range(k): + tmp = nums[last_index] + for i in range(last_index, 0, -1): + nums[i] = nums[i - 1] + nums[0] = tmp diff --git a/Week_01/id_3/array/189/test.py b/Week_01/id_3/array/189/test.py new file mode 100644 index 00000000..f0c0fec5 --- /dev/null +++ b/Week_01/id_3/array/189/test.py @@ -0,0 +1,12 @@ +import lc_189_v1 + +f = lc_189_v1.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]) diff --git a/Week_01/id_3/array/26/lc_26_v1.py b/Week_01/id_3/array/26/lc_26_v1.py new file mode 100644 index 00000000..0e08b7b4 --- /dev/null +++ b/Week_01/id_3/array/26/lc_26_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.py b/Week_01/id_3/array/26/test.py new file mode 100644 index 00000000..74085dbb --- /dev/null +++ b/Week_01/id_3/array/26/test.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]) From 6800fc339242b8bdb9f355e8c3197be87ad9ca44 Mon Sep 17 00:00:00 2001 From: yujingwen Date: Wed, 5 Jun 2019 04:13:02 +0800 Subject: [PATCH 02/75] update 189 --- Week_01/id_3/array/189/lc_189_v1.py | 18 ++++++++++++------ Week_01/id_3/array/189/test.py | 1 + 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/Week_01/id_3/array/189/lc_189_v1.py b/Week_01/id_3/array/189/lc_189_v1.py index f79a9401..d94ddba5 100644 --- a/Week_01/id_3/array/189/lc_189_v1.py +++ b/Week_01/id_3/array/189/lc_189_v1.py @@ -1,10 +1,16 @@ +import math + + def rotate(nums, k): if not nums: return - last_index = len(nums) - 1 - for t in range(k): - tmp = nums[last_index] - for i in range(last_index, 0, -1): - nums[i] = nums[i - 1] - nums[0] = tmp + length = len(nums) + gcd = math.gcd(length, k) + for t in range(gcd): + tmp = nums[t] + for i in range(int(length/gcd)): + index = ((i+1)*k + t) % length + _t = nums[index] + nums[index] = tmp + tmp = _t diff --git a/Week_01/id_3/array/189/test.py b/Week_01/id_3/array/189/test.py index f0c0fec5..71b3a302 100644 --- a/Week_01/id_3/array/189/test.py +++ b/Week_01/id_3/array/189/test.py @@ -10,3 +10,4 @@ def check(params, k, 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]) From a9a0c7fc6f6bdf95915c1b2db5c0008a8c9b91fe Mon Sep 17 00:00:00 2001 From: yujingwen Date: Wed, 5 Jun 2019 04:48:35 +0800 Subject: [PATCH 03/75] =?UTF-8?q?add=20189=20v2=20=E5=8F=8D=E8=BD=AC?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_01/id_3/array/189/lc_189_v2.py | 28 ++++++++++++++++++++++++++++ Week_01/id_3/array/189/test.py | 13 ++++++++++++- 2 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 Week_01/id_3/array/189/lc_189_v2.py diff --git a/Week_01/id_3/array/189/lc_189_v2.py b/Week_01/id_3/array/189/lc_189_v2.py new file mode 100644 index 00000000..cd7e6cd8 --- /dev/null +++ b/Week_01/id_3/array/189/lc_189_v2.py @@ -0,0 +1,28 @@ +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)): + _t = nums[i] + nums[i] = nums[tail-i] + nums[tail-i] = _t + + tail = -k + for i in range(int(k/2)): + ti = -i - 1 + _t = nums[ti] + nums[ti] = nums[tail+i] + nums[tail+i] = _t + + tail = length - 1 + for i in range(int(length/2)): + _t = nums[i] + nums[i] = nums[tail-i] + nums[tail-i] = _t diff --git a/Week_01/id_3/array/189/test.py b/Week_01/id_3/array/189/test.py index 71b3a302..83ee5de0 100644 --- a/Week_01/id_3/array/189/test.py +++ b/Week_01/id_3/array/189/test.py @@ -1,6 +1,8 @@ import lc_189_v1 +import lc_189_v2 -f = lc_189_v1.rotate +# f = lc_189_v1.rotate +f = lc_189_v2.rotate def check(params, k, arr): @@ -11,3 +13,12 @@ def check(params, k, 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] +) From 58e7c4a5e29592afb6cf7db53374b910e039e606 Mon Sep 17 00:00:00 2001 From: yujingwen Date: Wed, 5 Jun 2019 05:13:39 +0800 Subject: [PATCH 04/75] =?UTF-8?q?189=20=E7=AE=80=E5=8C=96=E6=9C=80?= =?UTF-8?q?=E5=90=8E=E5=8F=8D=E8=BD=AC=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_01/id_3/array/189/lc_189_v2.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Week_01/id_3/array/189/lc_189_v2.py b/Week_01/id_3/array/189/lc_189_v2.py index cd7e6cd8..4b46a052 100644 --- a/Week_01/id_3/array/189/lc_189_v2.py +++ b/Week_01/id_3/array/189/lc_189_v2.py @@ -21,8 +21,4 @@ def rotate(nums, k): nums[ti] = nums[tail+i] nums[tail+i] = _t - tail = length - 1 - for i in range(int(length/2)): - _t = nums[i] - nums[i] = nums[tail-i] - nums[tail-i] = _t + nums.reverse() From 5599aacb8584a559ba63eceb3afe15468efd7f1f Mon Sep 17 00:00:00 2001 From: yujingwen Date: Wed, 5 Jun 2019 16:56:22 +0800 Subject: [PATCH 05/75] =?UTF-8?q?lc=5F322=20=E5=9B=9E=E6=BA=AF+=E7=BC=93?= =?UTF-8?q?=E5=AD=98=E7=9A=84=E5=81=9A=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_01/id_3/NOTE.md | 2 ++ Week_01/id_3/recursion/322/lc_322_v1.py | 37 +++++++++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 Week_01/id_3/recursion/322/lc_322_v1.py diff --git a/Week_01/id_3/NOTE.md b/Week_01/id_3/NOTE.md index 107ea7d6..64b27238 100644 --- a/Week_01/id_3/NOTE.md +++ b/Week_01/id_3/NOTE.md @@ -1 +1,3 @@ # 学习笔记 + +python的数组下标访问比hash快多了 diff --git a/Week_01/id_3/recursion/322/lc_322_v1.py b/Week_01/id_3/recursion/322/lc_322_v1.py new file mode 100644 index 00000000..50449313 --- /dev/null +++ b/Week_01/id_3/recursion/322/lc_322_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)) From 90d2f879758a198165233ee063078cb09e8705bf Mon Sep 17 00:00:00 2001 From: yujingwen Date: Wed, 5 Jun 2019 19:17:01 +0800 Subject: [PATCH 06/75] =?UTF-8?q?=E4=BC=98=E5=8C=96=20189=20=E6=9C=80?= =?UTF-8?q?=E5=A4=A7=E5=85=AC=E7=BA=A6=E6=95=B0=E6=96=B9=E6=B3=95=E7=9A=84?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E7=BB=86=E8=8A=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_01/id_3/array/189/lc_189_v1.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Week_01/id_3/array/189/lc_189_v1.py b/Week_01/id_3/array/189/lc_189_v1.py index d94ddba5..799853d6 100644 --- a/Week_01/id_3/array/189/lc_189_v1.py +++ b/Week_01/id_3/array/189/lc_189_v1.py @@ -6,11 +6,17 @@ def rotate(nums, k): return length = len(nums) + k = k % length + + if not k: + return + gcd = math.gcd(length, k) + for t in range(gcd): tmp = nums[t] - for i in range(int(length/gcd)): - index = ((i+1)*k + t) % length + for i in range(1, int(length/gcd) + 1): + index = (i*k + t) % length _t = nums[index] nums[index] = tmp tmp = _t From d4a092902ffcad51cedbaf0f015a1fd3c20bf442 Mon Sep 17 00:00:00 2001 From: yujingwen Date: Wed, 5 Jun 2019 20:23:22 +0800 Subject: [PATCH 07/75] =?UTF-8?q?=E8=A1=A5=E5=85=85=E4=B8=80=E4=BA=9B?= =?UTF-8?q?=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_01/id_3/array/189/lc_189_v1.py | 7 +++++++ Week_01/id_3/array/189/lc_189_v2.py | 5 +++++ 2 files changed, 12 insertions(+) diff --git a/Week_01/id_3/array/189/lc_189_v1.py b/Week_01/id_3/array/189/lc_189_v1.py index 799853d6..cb177f0e 100644 --- a/Week_01/id_3/array/189/lc_189_v1.py +++ b/Week_01/id_3/array/189/lc_189_v1.py @@ -1,3 +1,10 @@ +# 最大公约数 +# 每次数组挪动一步,挪动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 diff --git a/Week_01/id_3/array/189/lc_189_v2.py b/Week_01/id_3/array/189/lc_189_v2.py index 4b46a052..9200a96f 100644 --- a/Week_01/id_3/array/189/lc_189_v2.py +++ b/Week_01/id_3/array/189/lc_189_v2.py @@ -1,3 +1,8 @@ +# 交换法 +# 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 From 04d88b9a7d75db75f4808073d40d53665e273bbb Mon Sep 17 00:00:00 2001 From: yujingwen Date: Wed, 5 Jun 2019 21:17:40 +0800 Subject: [PATCH 08/75] =?UTF-8?q?21=20=E5=90=88=E5=B9=B6=E6=9C=89=E5=BA=8F?= =?UTF-8?q?=E9=93=BE=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_01/id_3/linked/21/lc_21_v1.py | 18 ++++++++++++++ Week_01/id_3/linked/21/test.py | 39 ++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 Week_01/id_3/linked/21/lc_21_v1.py create mode 100644 Week_01/id_3/linked/21/test.py diff --git a/Week_01/id_3/linked/21/lc_21_v1.py b/Week_01/id_3/linked/21/lc_21_v1.py new file mode 100644 index 00000000..7164b4f6 --- /dev/null +++ b/Week_01/id_3/linked/21/lc_21_v1.py @@ -0,0 +1,18 @@ +def merge(l1, l2): + root = None + tmp = None + while l1 or l2: + if not l1 or (l2 and l1.val > l2.val): + _t = l2 + l2 = l2.next + else: + _t = l1 + l1 = l1.next + + if not root: + root = _t + else: + tmp.next = _t + tmp = _t + + return root diff --git a/Week_01/id_3/linked/21/test.py b/Week_01/id_3/linked/21/test.py new file mode 100644 index 00000000..de262e11 --- /dev/null +++ b/Week_01/id_3/linked/21/test.py @@ -0,0 +1,39 @@ +import lc_21_v1 + +f = lc_21_v1.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]) From 3ee6c420d9458325b58e3b48b42c4b91dc70dc60 Mon Sep 17 00:00:00 2001 From: yujingwen Date: Wed, 5 Jun 2019 21:30:03 +0800 Subject: [PATCH 09/75] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81=20?= =?UTF-8?q?=E5=BD=93=E4=B8=A4=E4=B8=AA=E9=93=BE=E8=A1=A8=E4=B8=AD=E6=9C=89?= =?UTF-8?q?=E4=B8=80=E4=B8=AA=E4=B8=BA=E7=A9=BA=E6=97=B6=20=E5=8F=A6?= =?UTF-8?q?=E4=B8=80=E4=B8=AA=E7=9B=B4=E6=8E=A5=E6=8E=A5=E5=9C=A8=E7=BB=93?= =?UTF-8?q?=E6=9E=9C=E9=93=BE=E8=A1=A8=E5=8D=B3=E5=8F=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_01/id_3/linked/21/lc_21_v1.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Week_01/id_3/linked/21/lc_21_v1.py b/Week_01/id_3/linked/21/lc_21_v1.py index 7164b4f6..3fdd470a 100644 --- a/Week_01/id_3/linked/21/lc_21_v1.py +++ b/Week_01/id_3/linked/21/lc_21_v1.py @@ -1,8 +1,8 @@ def merge(l1, l2): root = None tmp = None - while l1 or l2: - if not l1 or (l2 and l1.val > l2.val): + while l1 and l2: + if l1.val > l2.val: _t = l2 l2 = l2.next else: @@ -15,4 +15,6 @@ def merge(l1, l2): tmp.next = _t tmp = _t + tmp.next = l1 or l2 + return root From da351413c1c62db5185447af852a0121b1296e90 Mon Sep 17 00:00:00 2001 From: yujingwen Date: Wed, 5 Jun 2019 21:32:34 +0800 Subject: [PATCH 10/75] =?UTF-8?q?21=20=E5=A2=9E=E5=8A=A0=E5=AF=B9=E4=BA=8E?= =?UTF-8?q?=E4=B8=80=E5=BC=80=E5=A7=8B=E5=B0=B1=E6=9C=89=E7=A9=BA=E9=93=BE?= =?UTF-8?q?=E8=A1=A8=E7=9A=84=E6=83=85=E5=86=B5=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_01/id_3/linked/21/lc_21_v1.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Week_01/id_3/linked/21/lc_21_v1.py b/Week_01/id_3/linked/21/lc_21_v1.py index 3fdd470a..0db608ec 100644 --- a/Week_01/id_3/linked/21/lc_21_v1.py +++ b/Week_01/id_3/linked/21/lc_21_v1.py @@ -15,6 +15,9 @@ def merge(l1, l2): tmp.next = _t tmp = _t - tmp.next = l1 or l2 + if tmp: + tmp.next = l1 or l2 + else: + root = l1 or l2 return root From 2a73e2ba22e133b359841abcbf2f7ec4c62ace79 Mon Sep 17 00:00:00 2001 From: yujingwen Date: Wed, 5 Jun 2019 21:38:35 +0800 Subject: [PATCH 11/75] =?UTF-8?q?21=20=E5=A2=9E=E5=8A=A0=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E6=9B=B4=E7=AE=80=E7=9F=AD=E7=9A=84=E9=80=92=E5=BD=92=E7=9A=84?= =?UTF-8?q?=E6=96=B9=E6=B3=95=20=E4=BD=86=E6=98=AF=E7=A1=AE=E5=AE=9E?= =?UTF-8?q?=E5=8F=AF=E8=83=BD=E5=AD=98=E5=9C=A8=E9=80=92=E5=BD=92=E8=B0=83?= =?UTF-8?q?=E7=94=A8=E8=BF=87=E5=A4=9A=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_01/id_3/linked/21/lc_21_v2.py | 12 ++++++++++++ Week_01/id_3/linked/21/test.py | 4 +++- 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 Week_01/id_3/linked/21/lc_21_v2.py diff --git a/Week_01/id_3/linked/21/lc_21_v2.py b/Week_01/id_3/linked/21/lc_21_v2.py new file mode 100644 index 00000000..ce7d86a8 --- /dev/null +++ b/Week_01/id_3/linked/21/lc_21_v2.py @@ -0,0 +1,12 @@ +def merge(l1, l2): + if l1 and l2: + if l1.val < l2.val: + r = l1 + l1 = l1.next + else: + r = l2 + l2 = l2.next + r.next = merge(l1, l2) + return r + else: + return l1 or l2 diff --git a/Week_01/id_3/linked/21/test.py b/Week_01/id_3/linked/21/test.py index de262e11..76113534 100644 --- a/Week_01/id_3/linked/21/test.py +++ b/Week_01/id_3/linked/21/test.py @@ -1,6 +1,8 @@ import lc_21_v1 +import lc_21_v2 -f = lc_21_v1.merge +# f = lc_21_v1.merge +f = lc_21_v2.merge class ListNode: From 3f07ff94f668b6957cf12368bbfdb9567f97804b Mon Sep 17 00:00:00 2001 From: yujingwen Date: Wed, 5 Jun 2019 21:41:02 +0800 Subject: [PATCH 12/75] =?UTF-8?q?=E4=BF=AE=E6=94=B9test=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_01/id_3/array/189/{test.py => test_189.py} | 0 Week_01/id_3/array/26/{test.py => test_26.py} | 0 Week_01/id_3/linked/21/{test.py => test_21.py} | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename Week_01/id_3/array/189/{test.py => test_189.py} (100%) rename Week_01/id_3/array/26/{test.py => test_26.py} (100%) rename Week_01/id_3/linked/21/{test.py => test_21.py} (100%) diff --git a/Week_01/id_3/array/189/test.py b/Week_01/id_3/array/189/test_189.py similarity index 100% rename from Week_01/id_3/array/189/test.py rename to Week_01/id_3/array/189/test_189.py diff --git a/Week_01/id_3/array/26/test.py b/Week_01/id_3/array/26/test_26.py similarity index 100% rename from Week_01/id_3/array/26/test.py rename to Week_01/id_3/array/26/test_26.py diff --git a/Week_01/id_3/linked/21/test.py b/Week_01/id_3/linked/21/test_21.py similarity index 100% rename from Week_01/id_3/linked/21/test.py rename to Week_01/id_3/linked/21/test_21.py From 3a7757d01e3809dd6199ce4e94f98763799d01b3 Mon Sep 17 00:00:00 2001 From: yujingwen Date: Wed, 5 Jun 2019 22:18:24 +0800 Subject: [PATCH 13/75] =?UTF-8?q?88=20=E4=BB=8E=E5=90=8E=E5=90=91=E5=89=8D?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_01/id_3/array/88/lc_88_v1.py | 18 ++++++++++++++++++ Week_01/id_3/array/88/lc_88_v2.py | 7 +++++++ Week_01/id_3/array/88/test_88.py | 13 +++++++++++++ 3 files changed, 38 insertions(+) create mode 100644 Week_01/id_3/array/88/lc_88_v1.py create mode 100644 Week_01/id_3/array/88/lc_88_v2.py create mode 100644 Week_01/id_3/array/88/test_88.py diff --git a/Week_01/id_3/array/88/lc_88_v1.py b/Week_01/id_3/array/88/lc_88_v1.py new file mode 100644 index 00000000..d31fcbe1 --- /dev/null +++ b/Week_01/id_3/array/88/lc_88_v1.py @@ -0,0 +1,18 @@ +# nums1 m -> m+n 位置是剩余空间 如果按从小到大排序会出现复杂的冲突 +# 而从大到小排列, 最大的元素移动到剩余空间的末端,则可以避免出现冲突 + + +def merge(nums1, m, nums2, n): + tail = m + n + m -= 1 + n -= 1 + for i in range(tail): + tail -= 1 + if n < 0: + break + if m >= 0 and nums1[m] > nums2[n]: + nums1[tail] = nums1[m] + m -= 1 + else: + nums1[tail] = nums2[n] + n -= 1 diff --git a/Week_01/id_3/array/88/lc_88_v2.py b/Week_01/id_3/array/88/lc_88_v2.py new file mode 100644 index 00000000..196cdb3a --- /dev/null +++ b/Week_01/id_3/array/88/lc_88_v2.py @@ -0,0 +1,7 @@ +# 题目未要求原地排序 所以弄个简单的 + + +def merge(nums1, m, nums2, n): + r = nums1[:m] + nums2[:n] + r.sort() + nums1[:m+n] = r 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]) From 5de4ffeb1934c4d65490933ce79a72f46a74f50a Mon Sep 17 00:00:00 2001 From: yujingwen Date: Thu, 6 Jun 2019 03:42:54 +0800 Subject: [PATCH 14/75] =?UTF-8?q?24=20=E9=93=BE=E8=A1=A8=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E5=BE=AA=E7=8E=AF=E4=B8=8E=E9=80=92=E5=BD=92=E4=B8=A4?= =?UTF-8?q?=E7=A7=8D=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_01/id_3/linked/24/lc_24_v1.py | 10 +++++++ Week_01/id_3/linked/24/lc_24_v2.py | 14 ++++++++++ Week_01/id_3/linked/24/test_24.py | 43 ++++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+) create mode 100644 Week_01/id_3/linked/24/lc_24_v1.py create mode 100644 Week_01/id_3/linked/24/lc_24_v2.py create mode 100644 Week_01/id_3/linked/24/test_24.py diff --git a/Week_01/id_3/linked/24/lc_24_v1.py b/Week_01/id_3/linked/24/lc_24_v1.py new file mode 100644 index 00000000..453621ad --- /dev/null +++ b/Week_01/id_3/linked/24/lc_24_v1.py @@ -0,0 +1,10 @@ +def swap(head): + if not head: + return None + nxt = head.next + if not nxt: + return head + tmp = nxt.next + nxt.next = head + head.next = swap(tmp) + return nxt diff --git a/Week_01/id_3/linked/24/lc_24_v2.py b/Week_01/id_3/linked/24/lc_24_v2.py new file mode 100644 index 00000000..1a23a39c --- /dev/null +++ b/Week_01/id_3/linked/24/lc_24_v2.py @@ -0,0 +1,14 @@ +def swap(head): + if not head or not head.next: + return head + + result = head.next + + while head and head.next: + nxt = head.next + tmp = nxt.next + nxt.next = head + head.next = (tmp and tmp.next) or tmp + head = tmp + + return result 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..6fd595b6 --- /dev/null +++ b/Week_01/id_3/linked/24/test_24.py @@ -0,0 +1,43 @@ +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) + print(r) + return r + + +def check(l, r): + _r = export(f(build(l))) + print(_r, _r == r) + + +check([1, 2, 3, 4], [2, 1, 4, 3]) +check([1, 2, 3], [2, 1, 3]) From 869036ce1dbe116682fe707d8ad520484619995c Mon Sep 17 00:00:00 2001 From: yujingwen Date: Thu, 6 Jun 2019 04:38:33 +0800 Subject: [PATCH 15/75] =?UTF-8?q?15=20=E7=94=A8=E4=B8=80=E7=A7=8D=E4=BC=BC?= =?UTF-8?q?=E4=B9=8E=E5=BE=88=E4=B8=91=E9=99=8B=E7=9A=84=E6=96=B9=E5=BC=8F?= =?UTF-8?q?=E5=AE=8C=E6=88=90=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_01/id_3/array/15/lc_15_v1.py | 38 +++++++++++++++++++++++++++++++ Week_01/id_3/array/15/test_15.py | 19 ++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 Week_01/id_3/array/15/lc_15_v1.py create mode 100644 Week_01/id_3/array/15/test_15.py diff --git a/Week_01/id_3/array/15/lc_15_v1.py b/Week_01/id_3/array/15/lc_15_v1.py new file mode 100644 index 00000000..9b8d9612 --- /dev/null +++ b/Week_01/id_3/array/15/lc_15_v1.py @@ -0,0 +1,38 @@ +def three_sum(nums): + r = [] + if not nums: + return r + + cache = {} + dset = set() + + new_nums = [] + + for n in nums: + count = 1 + cache.get(n, 0) + cache[n] = count + if count <= 3: + new_nums.append(n) + + nums = new_nums + + length = len(nums) + for i in range(length): + for j in range(i+1, length): + n1 = nums[i] + n2 = nums[j] + if n1 == 0 and n2 == 0 and cache[0] < 3: + continue + s = n1 + n2 + if (-s == n1 or -s == n2) and cache.get(-s, 0) == 1: + continue + + if cache.get(-s, 0): + arr = [n1, n2, -s] + arr.sort() + ds = ','.join(map(str, arr)) + if ds not in dset: + dset.add(ds) + r.append(arr) + + return 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..acb5c3bf --- /dev/null +++ b/Week_01/id_3/array/15/test_15.py @@ -0,0 +1,19 @@ +import lc_15_v1 + +f = lc_15_v1.three_sum + + +def check(nums, r): + _r = f(nums) + print(_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]]) From 00484335d10b6e284e98f891643519ff93ba06ce Mon Sep 17 00:00:00 2001 From: yujingwen Date: Thu, 6 Jun 2019 05:02:36 +0800 Subject: [PATCH 16/75] =?UTF-8?q?15=20=E6=80=A7=E8=83=BD=E4=B8=8A=E4=BC=98?= =?UTF-8?q?=E5=8C=96=EF=BC=8C=E8=BF=9B=E8=A1=8C=E6=9B=B4=E5=A4=9A=E5=89=AA?= =?UTF-8?q?=E6=9E=9D=20=E5=8A=A0=E5=85=A5=E7=BD=91=E4=B8=8A5=E8=A1=8C?= =?UTF-8?q?=E7=AD=94=E6=A1=88=E8=BF=9B=E8=A1=8C=E5=8F=82=E8=80=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_01/id_3/array/15/lc_15_v1.py | 10 +++++++++- Week_01/id_3/array/15/lc_15_v2.py | 6 ++++++ Week_01/id_3/array/15/test_15.py | 4 +++- 3 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 Week_01/id_3/array/15/lc_15_v2.py diff --git a/Week_01/id_3/array/15/lc_15_v1.py b/Week_01/id_3/array/15/lc_15_v1.py index 9b8d9612..91b09420 100644 --- a/Week_01/id_3/array/15/lc_15_v1.py +++ b/Week_01/id_3/array/15/lc_15_v1.py @@ -11,10 +11,13 @@ def three_sum(nums): for n in nums: count = 1 + cache.get(n, 0) cache[n] = count - if count <= 3: + if n == 0 and count <= 3: + new_nums.append(n) + elif count <= 2: new_nums.append(n) nums = new_nums + nums.sort() length = len(nums) for i in range(length): @@ -24,6 +27,11 @@ def three_sum(nums): if n1 == 0 and n2 == 0 and cache[0] < 3: continue s = n1 + n2 + + # 已排序的数组,剪掉重复的计算。 + if s > 0: + break + if (-s == n1 or -s == n2) and cache.get(-s, 0) == 1: continue diff --git a/Week_01/id_3/array/15/lc_15_v2.py b/Week_01/id_3/array/15/lc_15_v2.py new file mode 100644 index 00000000..0efa111d --- /dev/null +++ b/Week_01/id_3/array/15/lc_15_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 index acb5c3bf..ee1c0567 100644 --- a/Week_01/id_3/array/15/test_15.py +++ b/Week_01/id_3/array/15/test_15.py @@ -1,6 +1,8 @@ import lc_15_v1 +import lc_15_v2 -f = lc_15_v1.three_sum +# f = lc_15_v1.three_sum +f = lc_15_v2.three_sum def check(nums, r): From 9ca3c969db7ba4bdc2e8efdf505d00a364356889 Mon Sep 17 00:00:00 2001 From: yujingwen Date: Thu, 6 Jun 2019 14:09:33 +0800 Subject: [PATCH 17/75] =?UTF-8?q?15=20=E8=BF=9B=E4=B8=80=E6=AD=A5=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E4=BB=A3=E7=A0=81=20=E4=BC=98=E5=8C=96=E5=89=AA?= =?UTF-8?q?=E6=9E=9D=201120=20ms=2064.83%?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_01/id_3/array/15/lc_15_v1.py | 27 ++++++++++++++++----------- Week_01/id_3/array/15/test_15.py | 7 +++++-- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/Week_01/id_3/array/15/lc_15_v1.py b/Week_01/id_3/array/15/lc_15_v1.py index 91b09420..0b75de75 100644 --- a/Week_01/id_3/array/15/lc_15_v1.py +++ b/Week_01/id_3/array/15/lc_15_v1.py @@ -11,11 +11,16 @@ def three_sum(nums): for n in nums: count = 1 + cache.get(n, 0) cache[n] = count - if n == 0 and count <= 3: - new_nums.append(n) - elif count <= 2: + 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() @@ -26,19 +31,19 @@ def three_sum(nums): n2 = nums[j] if n1 == 0 and n2 == 0 and cache[0] < 3: continue - s = n1 + n2 + s = -(n1 + n2) - # 已排序的数组,剪掉重复的计算。 - if s > 0: + # 迭代顺序是从小到大的 + # 当-sum(n1,n2)的结果小于n2时 说明已经迭代出现了重复 -sum必然在之前已经迭代过 + if s < n2: break - if (-s == n1 or -s == n2) and cache.get(-s, 0) == 1: + if (s == n1 or s == n2) and cache.get(s, 0) == 1: continue - if cache.get(-s, 0): - arr = [n1, n2, -s] - arr.sort() - ds = ','.join(map(str, arr)) + 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) diff --git a/Week_01/id_3/array/15/test_15.py b/Week_01/id_3/array/15/test_15.py index ee1c0567..7e644583 100644 --- a/Week_01/id_3/array/15/test_15.py +++ b/Week_01/id_3/array/15/test_15.py @@ -1,8 +1,8 @@ import lc_15_v1 import lc_15_v2 -# f = lc_15_v1.three_sum -f = lc_15_v2.three_sum +f = lc_15_v1.three_sum +# f = lc_15_v2.three_sum def check(nums, r): @@ -19,3 +19,6 @@ def check(nums, r): 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]]) From fb6f6966a963455ebd599e112cdce5f5f9169349 Mon Sep 17 00:00:00 2001 From: yujingwen Date: Fri, 7 Jun 2019 18:00:47 +0800 Subject: [PATCH 18/75] =?UTF-8?q?189=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=20=E5=8A=A0=E5=85=A5=E6=9B=B4python=E7=9A=84=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E4=BA=A4=E6=8D=A2=E5=86=99=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_01/id_3/array/189/lc_189_v1.py | 10 ++++------ Week_01/id_3/array/189/lc_189_v2.py | 9 ++------- 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/Week_01/id_3/array/189/lc_189_v1.py b/Week_01/id_3/array/189/lc_189_v1.py index cb177f0e..2880a713 100644 --- a/Week_01/id_3/array/189/lc_189_v1.py +++ b/Week_01/id_3/array/189/lc_189_v1.py @@ -20,10 +20,8 @@ def rotate(nums, k): gcd = math.gcd(length, k) - for t in range(gcd): - tmp = nums[t] + for offset in range(gcd): + tmp = nums[offset] for i in range(1, int(length/gcd) + 1): - index = (i*k + t) % length - _t = nums[index] - nums[index] = tmp - tmp = _t + index = (i*k + offset) % length + nums[index], tmp = tmp, nums[index] diff --git a/Week_01/id_3/array/189/lc_189_v2.py b/Week_01/id_3/array/189/lc_189_v2.py index 9200a96f..a3dedc2e 100644 --- a/Week_01/id_3/array/189/lc_189_v2.py +++ b/Week_01/id_3/array/189/lc_189_v2.py @@ -15,15 +15,10 @@ def rotate(nums, k): tail = length - k - 1 for i in range(int((length-k)/2)): - _t = nums[i] - nums[i] = nums[tail-i] - nums[tail-i] = _t + nums[i], nums[tail-i] = nums[tail-i], nums[i] tail = -k for i in range(int(k/2)): - ti = -i - 1 - _t = nums[ti] - nums[ti] = nums[tail+i] - nums[tail+i] = _t + nums[-i-1], nums[tail+i] = nums[tail+i], nums[-i-1] nums.reverse() From 5b929a88d003f934e739b1c706bd4c04135f62bc Mon Sep 17 00:00:00 2001 From: yujingwen Date: Fri, 7 Jun 2019 18:25:19 +0800 Subject: [PATCH 19/75] =?UTF-8?q?21=20=E7=94=A8=E6=9B=B4python=E7=9A=84?= =?UTF-8?q?=E6=96=B9=E5=BC=8F=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_01/id_3/NOTE.md | 5 +++++ Week_01/id_3/linked/21/lc_21_v1.py | 33 ++++++++++++------------------ Week_01/id_3/linked/21/lc_21_v2.py | 19 ++++++++--------- 3 files changed, 27 insertions(+), 30 deletions(-) diff --git a/Week_01/id_3/NOTE.md b/Week_01/id_3/NOTE.md index 64b27238..d545ba99 100644 --- a/Week_01/id_3/NOTE.md +++ b/Week_01/id_3/NOTE.md @@ -1,3 +1,8 @@ # 学习笔记 +## 小技巧 python的数组下标访问比hash快多了 + +l1, l2 = l2, l1 +这个语法不但简单,而且思路其实适用于任何语言。 +两个变量没有顺序要求,我们可以通过预处理的方式,强制变成有先后关系,这就避免了维护一个中间标量的尴尬 diff --git a/Week_01/id_3/linked/21/lc_21_v1.py b/Week_01/id_3/linked/21/lc_21_v1.py index 0db608ec..2ec4b375 100644 --- a/Week_01/id_3/linked/21/lc_21_v1.py +++ b/Week_01/id_3/linked/21/lc_21_v1.py @@ -1,23 +1,16 @@ +class ListNode: + def __init__(self, x): + self.val = x + self.next = None + + def merge(l1, l2): - root = None - tmp = None + cur = root = ListNode(0) while l1 and l2: if l1.val > l2.val: - _t = l2 - l2 = l2.next - else: - _t = l1 - l1 = l1.next - - if not root: - root = _t - else: - tmp.next = _t - tmp = _t - - if tmp: - tmp.next = l1 or l2 - else: - root = l1 or l2 - - return root + 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/lc_21_v2.py b/Week_01/id_3/linked/21/lc_21_v2.py index ce7d86a8..2236affa 100644 --- a/Week_01/id_3/linked/21/lc_21_v2.py +++ b/Week_01/id_3/linked/21/lc_21_v2.py @@ -1,12 +1,11 @@ +# 本代码按python语法进行优化 查看之前得提交可以看到更远古的写法 + + def merge(l1, l2): - if l1 and l2: - if l1.val < l2.val: - r = l1 - l1 = l1.next - else: - r = l2 - l2 = l2.next - r.next = merge(l1, l2) - return r - else: + 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 From 128f7eede258aecc63dbacd236b94fe6b1d07b58 Mon Sep 17 00:00:00 2001 From: yujingwen Date: Sat, 8 Jun 2019 02:08:23 +0800 Subject: [PATCH 20/75] =?UTF-8?q?88=20=E9=9D=9E=E5=8E=9F=E5=9C=B0=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E4=BC=98=E5=8C=96=E8=87=B31=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_01/id_3/array/88/lc_88_v2.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Week_01/id_3/array/88/lc_88_v2.py b/Week_01/id_3/array/88/lc_88_v2.py index 196cdb3a..1fe5fd04 100644 --- a/Week_01/id_3/array/88/lc_88_v2.py +++ b/Week_01/id_3/array/88/lc_88_v2.py @@ -1,7 +1,5 @@ -# 题目未要求原地排序 所以弄个简单的 +# 题目并未要求原地排序 所以弄个简单的 def merge(nums1, m, nums2, n): - r = nums1[:m] + nums2[:n] - r.sort() - nums1[:m+n] = r + nums1[:m+n] = sorted(nums1[:m] + nums2[:n]) From b2138fa78833a656196776969b4872b339269bdf Mon Sep 17 00:00:00 2001 From: yujingwen Date: Sat, 8 Jun 2019 02:23:48 +0800 Subject: [PATCH 21/75] =?UTF-8?q?88=20=E7=95=A5=E5=BE=AE=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E5=BE=AA=E7=8E=AF=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_01/id_3/array/88/lc_88_v1.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Week_01/id_3/array/88/lc_88_v1.py b/Week_01/id_3/array/88/lc_88_v1.py index d31fcbe1..6acbc9e8 100644 --- a/Week_01/id_3/array/88/lc_88_v1.py +++ b/Week_01/id_3/array/88/lc_88_v1.py @@ -4,15 +4,13 @@ def merge(nums1, m, nums2, n): tail = m + n - m -= 1 - n -= 1 for i in range(tail): tail -= 1 if n < 0: break if m >= 0 and nums1[m] > nums2[n]: - nums1[tail] = nums1[m] m -= 1 + nums1[tail] = nums1[m] else: - nums1[tail] = nums2[n] n -= 1 + nums1[tail] = nums2[n] From bcae24aef2fa051bb0d40723c501d9b4bce1387c Mon Sep 17 00:00:00 2001 From: yujingwen Date: Sat, 8 Jun 2019 02:32:25 +0800 Subject: [PATCH 22/75] =?UTF-8?q?=E4=BC=98=E5=8C=9688=20=E5=BE=AA=E7=8E=AF?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=20=E4=BC=98=E5=8C=9624=20=E9=80=92=E5=BD=92?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_01/id_3/array/88/lc_88_v1.py | 6 +++--- Week_01/id_3/linked/24/lc_24_v1.py | 9 +++------ Week_01/id_3/linked/24/test_24.py | 7 +++---- 3 files changed, 9 insertions(+), 13 deletions(-) diff --git a/Week_01/id_3/array/88/lc_88_v1.py b/Week_01/id_3/array/88/lc_88_v1.py index 6acbc9e8..14856118 100644 --- a/Week_01/id_3/array/88/lc_88_v1.py +++ b/Week_01/id_3/array/88/lc_88_v1.py @@ -5,10 +5,10 @@ def merge(nums1, m, nums2, n): tail = m + n for i in range(tail): - tail -= 1 - if n < 0: + if n == 0: break - if m >= 0 and nums1[m] > nums2[n]: + tail -= 1 + if m > 0 and nums1[m-1] > nums2[n-1]: m -= 1 nums1[tail] = nums1[m] else: diff --git a/Week_01/id_3/linked/24/lc_24_v1.py b/Week_01/id_3/linked/24/lc_24_v1.py index 453621ad..0dcf7fe8 100644 --- a/Week_01/id_3/linked/24/lc_24_v1.py +++ b/Week_01/id_3/linked/24/lc_24_v1.py @@ -1,10 +1,7 @@ def swap(head): - if not head: - return None - nxt = head.next - if not nxt: + if not head or not head.next: return head - tmp = nxt.next + nxt = head.next + head.next = swap(nxt.next) nxt.next = head - head.next = swap(tmp) return nxt diff --git a/Week_01/id_3/linked/24/test_24.py b/Week_01/id_3/linked/24/test_24.py index 6fd595b6..dcf8d6a5 100644 --- a/Week_01/id_3/linked/24/test_24.py +++ b/Week_01/id_3/linked/24/test_24.py @@ -1,8 +1,8 @@ import lc_24_v1 import lc_24_v2 -# f = lc_24_v1.swap -f = lc_24_v2.swap +f = lc_24_v1.swap +# f = lc_24_v2.swap class ListNode: @@ -30,13 +30,12 @@ def export(root): while root.next: root = root.next r.append(root.val) - print(r) return r def check(l, r): _r = export(f(build(l))) - print(_r, _r == r) + print(_r, r, _r == r) check([1, 2, 3, 4], [2, 1, 4, 3]) From 9791edc4d28e824cbd747a9c28d0d97c012da4b8 Mon Sep 17 00:00:00 2001 From: yujingwen Date: Sat, 8 Jun 2019 02:55:07 +0800 Subject: [PATCH 23/75] =?UTF-8?q?24=20=E4=BD=BF=E7=94=A8=E5=93=A8=E5=85=B5?= =?UTF-8?q?=E5=92=8Cpython=E4=BA=A4=E6=8D=A2=E5=8F=98=E9=87=8F=E8=AF=AD?= =?UTF-8?q?=E6=B3=95=E8=BF=9B=E4=B8=80=E6=AD=A5=E7=AE=80=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_01/id_3/linked/24/lc_24_v2.py | 18 +++++++++++------- Week_01/id_3/linked/24/test_24.py | 4 ++-- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/Week_01/id_3/linked/24/lc_24_v2.py b/Week_01/id_3/linked/24/lc_24_v2.py index 1a23a39c..9b5acaa5 100644 --- a/Week_01/id_3/linked/24/lc_24_v2.py +++ b/Week_01/id_3/linked/24/lc_24_v2.py @@ -1,14 +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 - result = head.next - + root = prev = ListNode(0) while head and head.next: nxt = head.next - tmp = nxt.next - nxt.next = head - head.next = (tmp and tmp.next) or tmp - head = tmp + prev.next = nxt + nxt.next, prev, head = head, head, nxt.next - return result + 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 index dcf8d6a5..a2f6757d 100644 --- a/Week_01/id_3/linked/24/test_24.py +++ b/Week_01/id_3/linked/24/test_24.py @@ -1,8 +1,8 @@ import lc_24_v1 import lc_24_v2 -f = lc_24_v1.swap -# f = lc_24_v2.swap +# f = lc_24_v1.swap +f = lc_24_v2.swap class ListNode: From 5bf86b2fcd239e9ded35f3ebfdc756bcb857439d Mon Sep 17 00:00:00 2001 From: yujingwen Date: Sat, 8 Jun 2019 04:07:52 +0800 Subject: [PATCH 24/75] =?UTF-8?q?15=20=E8=BF=9B=E4=B8=80=E6=AD=A5=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E5=89=AA=E6=9E=9D=20=E6=89=93=E8=B4=A592%?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_01/id_3/array/15/lc_15_v1.py | 5 ++++- Week_01/id_3/array/15/test_15.py | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Week_01/id_3/array/15/lc_15_v1.py b/Week_01/id_3/array/15/lc_15_v1.py index 0b75de75..bf092c1e 100644 --- a/Week_01/id_3/array/15/lc_15_v1.py +++ b/Week_01/id_3/array/15/lc_15_v1.py @@ -26,8 +26,11 @@ def three_sum(nums): length = len(nums) for i in range(length): + n1 = nums[i] + # n1 >= 0 时说明已经遍历把有效的数据都进行遍历,继续遍历已经发生重复 + if n1 >= 0: + break for j in range(i+1, length): - n1 = nums[i] n2 = nums[j] if n1 == 0 and n2 == 0 and cache[0] < 3: continue diff --git a/Week_01/id_3/array/15/test_15.py b/Week_01/id_3/array/15/test_15.py index 7e644583..f5d350fa 100644 --- a/Week_01/id_3/array/15/test_15.py +++ b/Week_01/id_3/array/15/test_15.py @@ -7,7 +7,7 @@ def check(nums, r): _r = f(nums) - print(_r, _r == r) + print(_r, r, _r == r) check([-1, 0, 1, 2, -1, -4], From 5f43ff863e8ed1dc189723748b0f0e82843c3cf7 Mon Sep 17 00:00:00 2001 From: yujingwen Date: Sat, 8 Jun 2019 04:53:01 +0800 Subject: [PATCH 25/75] =?UTF-8?q?49=20&=20242=20=E6=AF=94=E8=BE=83?= =?UTF-8?q?=E7=AE=80=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_01/id_3/hash/242/lc_242_v1.py | 16 ++++++++++++++++ Week_01/id_3/hash/242/test_242.py | 6 ++++++ Week_01/id_3/hash/49/lc_49_v1.py | 9 +++++++++ Week_01/id_3/hash/49/test_49.py | 10 ++++++++++ 4 files changed, 41 insertions(+) create mode 100644 Week_01/id_3/hash/242/lc_242_v1.py create mode 100644 Week_01/id_3/hash/242/test_242.py create mode 100644 Week_01/id_3/hash/49/lc_49_v1.py create mode 100644 Week_01/id_3/hash/49/test_49.py diff --git a/Week_01/id_3/hash/242/lc_242_v1.py b/Week_01/id_3/hash/242/lc_242_v1.py new file mode 100644 index 00000000..0d654d04 --- /dev/null +++ b/Week_01/id_3/hash/242/lc_242_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/lc_49_v1.py b/Week_01/id_3/hash/49/lc_49_v1.py new file mode 100644 index 00000000..9bbc7ebd --- /dev/null +++ b/Week_01/id_3/hash/49/lc_49_v1.py @@ -0,0 +1,9 @@ +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()) 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"] + ]) From a46232997d2a5704012b2100b5be2885d31847f7 Mon Sep 17 00:00:00 2001 From: yujingwen Date: Sat, 8 Jun 2019 18:04:24 +0800 Subject: [PATCH 26/75] 1047 --- Week_01/id_3/stack/1047/lc_1047_v1.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 Week_01/id_3/stack/1047/lc_1047_v1.py diff --git a/Week_01/id_3/stack/1047/lc_1047_v1.py b/Week_01/id_3/stack/1047/lc_1047_v1.py new file mode 100644 index 00000000..1a82b5d2 --- /dev/null +++ b/Week_01/id_3/stack/1047/lc_1047_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') From 4bfaeadb16629fa46767f324f4ac4eaf71ad15c7 Mon Sep 17 00:00:00 2001 From: yujingwen Date: Sat, 8 Jun 2019 18:30:39 +0800 Subject: [PATCH 27/75] 1021 & 1047 --- Week_01/id_3/stack_queue/1021/lc_1021_v1.py | 13 +++++++++++++ Week_01/id_3/stack_queue/1021/lc_1021_v2.py | 13 +++++++++++++ Week_01/id_3/stack_queue/1021/test_1021.py | 15 +++++++++++++++ .../{stack => stack_queue}/1047/lc_1047_v1.py | 0 4 files changed, 41 insertions(+) create mode 100644 Week_01/id_3/stack_queue/1021/lc_1021_v1.py create mode 100644 Week_01/id_3/stack_queue/1021/lc_1021_v2.py create mode 100644 Week_01/id_3/stack_queue/1021/test_1021.py rename Week_01/id_3/{stack => stack_queue}/1047/lc_1047_v1.py (100%) diff --git a/Week_01/id_3/stack_queue/1021/lc_1021_v1.py b/Week_01/id_3/stack_queue/1021/lc_1021_v1.py new file mode 100644 index 00000000..b653c38c --- /dev/null +++ b/Week_01/id_3/stack_queue/1021/lc_1021_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/lc_1021_v2.py b/Week_01/id_3/stack_queue/1021/lc_1021_v2.py new file mode 100644 index 00000000..19fd7b3e --- /dev/null +++ b/Week_01/id_3/stack_queue/1021/lc_1021_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/1047/lc_1047_v1.py b/Week_01/id_3/stack_queue/1047/lc_1047_v1.py similarity index 100% rename from Week_01/id_3/stack/1047/lc_1047_v1.py rename to Week_01/id_3/stack_queue/1047/lc_1047_v1.py From 54e7c4d80f222058db21b7b60bbe07992186d530 Mon Sep 17 00:00:00 2001 From: yujingwen Date: Sun, 9 Jun 2019 17:11:09 +0800 Subject: [PATCH 28/75] =?UTF-8?q?add=20441=20=E5=8F=AF=E6=83=9C=E8=B6=85?= =?UTF-8?q?=E6=97=B6=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_01/id_3/bs/441/lc_441_v1.py | 10 ++++++++++ Week_01/id_3/bs/441/lc_441_v2.py | 12 ++++++++++++ Week_01/id_3/bs/441/test_441.py | 14 ++++++++++++++ 3 files changed, 36 insertions(+) create mode 100644 Week_01/id_3/bs/441/lc_441_v1.py create mode 100644 Week_01/id_3/bs/441/lc_441_v2.py create mode 100644 Week_01/id_3/bs/441/test_441.py diff --git a/Week_01/id_3/bs/441/lc_441_v1.py b/Week_01/id_3/bs/441/lc_441_v1.py new file mode 100644 index 00000000..3dbe67ad --- /dev/null +++ b/Week_01/id_3/bs/441/lc_441_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/lc_441_v2.py b/Week_01/id_3/bs/441/lc_441_v2.py new file mode 100644 index 00000000..b0aa1909 --- /dev/null +++ b/Week_01/id_3/bs/441/lc_441_v2.py @@ -0,0 +1,12 @@ +def arrange_coins(n): + if n <= 0: + return 0 + k = 1 + + while True: + s = int(((1 + k) * k)/2) + 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..3156f142 --- /dev/null +++ b/Week_01/id_3/bs/441/test_441.py @@ -0,0 +1,14 @@ +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) From b5d90ca86625dc6202dd3746523d2f8e6609d47a Mon Sep 17 00:00:00 2001 From: yujingwen Date: Sun, 9 Jun 2019 19:16:42 +0800 Subject: [PATCH 29/75] 104 && 236 --- Week_01/id_3/bs/441/lc_441_v2.py | 4 +++ Week_01/id_3/bs/441/test_441.py | 1 + Week_01/id_3/recursion/104/lc_104_v1.py | 4 +++ Week_01/id_3/recursion/104/test_104.py | 34 ++++++++++++++++++++++++ Week_01/id_3/recursion/236/lc_236_v1.py | 8 ++++++ Week_01/id_3/recursion/236/test_236.py | 35 +++++++++++++++++++++++++ 6 files changed, 86 insertions(+) create mode 100644 Week_01/id_3/recursion/104/lc_104_v1.py create mode 100644 Week_01/id_3/recursion/104/test_104.py create mode 100644 Week_01/id_3/recursion/236/lc_236_v1.py create mode 100644 Week_01/id_3/recursion/236/test_236.py diff --git a/Week_01/id_3/bs/441/lc_441_v2.py b/Week_01/id_3/bs/441/lc_441_v2.py index b0aa1909..cce7fc27 100644 --- a/Week_01/id_3/bs/441/lc_441_v2.py +++ b/Week_01/id_3/bs/441/lc_441_v2.py @@ -1,3 +1,6 @@ +# 此题超时了 有待用二分优化 + + def arrange_coins(n): if n <= 0: return 0 @@ -5,6 +8,7 @@ def arrange_coins(n): while True: s = int(((1 + k) * k)/2) + print(s, k) if s == n: return k if s > n: diff --git a/Week_01/id_3/bs/441/test_441.py b/Week_01/id_3/bs/441/test_441.py index 3156f142..73393066 100644 --- a/Week_01/id_3/bs/441/test_441.py +++ b/Week_01/id_3/bs/441/test_441.py @@ -12,3 +12,4 @@ def check(n, r): check(5, 2) check(8, 3) +check(2146533481, 65521) diff --git a/Week_01/id_3/recursion/104/lc_104_v1.py b/Week_01/id_3/recursion/104/lc_104_v1.py new file mode 100644 index 00000000..17237338 --- /dev/null +++ b/Week_01/id_3/recursion/104/lc_104_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/test_104.py b/Week_01/id_3/recursion/104/test_104.py new file mode 100644 index 00000000..95b17ced --- /dev/null +++ b/Week_01/id_3/recursion/104/test_104.py @@ -0,0 +1,34 @@ +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_104_v1 + +f = lc_104_v1.max_depth + + +def check(nums, r): + _r = f(build(nums)) + print(_r, r, _r == r) + + +check([3, 9, 20, None, None, 15, 7], 3) diff --git a/Week_01/id_3/recursion/236/lc_236_v1.py b/Week_01/id_3/recursion/236/lc_236_v1.py new file mode 100644 index 00000000..bc223464 --- /dev/null +++ b/Week_01/id_3/recursion/236/lc_236_v1.py @@ -0,0 +1,8 @@ +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) From 94ea332ca941eac14001441d943dad2d4e39a6ee Mon Sep 17 00:00:00 2001 From: yujingwen Date: Sun, 9 Jun 2019 23:39:07 +0800 Subject: [PATCH 30/75] =?UTF-8?q?=E4=BC=98=E5=8C=96=2015=20=E7=9A=84?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E7=BB=86=E8=8A=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_01/id_3/array/15/lc_15_v1.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Week_01/id_3/array/15/lc_15_v1.py b/Week_01/id_3/array/15/lc_15_v1.py index bf092c1e..39c32709 100644 --- a/Week_01/id_3/array/15/lc_15_v1.py +++ b/Week_01/id_3/array/15/lc_15_v1.py @@ -1,6 +1,6 @@ def three_sum(nums): r = [] - if not nums: + if not nums or len(nums) < 3: return r cache = {} From 5bd993caaed0fb339aa5750968577168a700f37d Mon Sep 17 00:00:00 2001 From: yujingwen Date: Mon, 10 Jun 2019 03:50:10 +0800 Subject: [PATCH 31/75] add 101 --- Week_01/id_3/NOTE.md | 2 ++ Week_01/id_3/recursion/101/lc_101_v1.py | 35 +++++++++++++++++++++++ Week_01/id_3/recursion/101/lc_101_v2.py | 24 ++++++++++++++++ Week_01/id_3/recursion/101/lc_101_v3.py | 28 ++++++++++++++++++ Week_01/id_3/recursion/101/test_101.py | 38 +++++++++++++++++++++++++ 5 files changed, 127 insertions(+) create mode 100644 Week_01/id_3/recursion/101/lc_101_v1.py create mode 100644 Week_01/id_3/recursion/101/lc_101_v2.py create mode 100644 Week_01/id_3/recursion/101/lc_101_v3.py create mode 100644 Week_01/id_3/recursion/101/test_101.py diff --git a/Week_01/id_3/NOTE.md b/Week_01/id_3/NOTE.md index d545ba99..f6890693 100644 --- a/Week_01/id_3/NOTE.md +++ b/Week_01/id_3/NOTE.md @@ -6,3 +6,5 @@ python的数组下标访问比hash快多了 l1, l2 = l2, l1 这个语法不但简单,而且思路其实适用于任何语言。 两个变量没有顺序要求,我们可以通过预处理的方式,强制变成有先后关系,这就避免了维护一个中间标量的尴尬 + +python的异或实现 bool(n1) != bool(n2) js也可以参考 diff --git a/Week_01/id_3/recursion/101/lc_101_v1.py b/Week_01/id_3/recursion/101/lc_101_v1.py new file mode 100644 index 00000000..5b670cd7 --- /dev/null +++ b/Week_01/id_3/recursion/101/lc_101_v1.py @@ -0,0 +1,35 @@ +# 尝试使用广度优先 比较层内是否对称 +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 + + +def is_mirror(queue): + length = len(queue) + if length == 1: + return True + if length % 2 == 1: + return False + + 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/lc_101_v2.py b/Week_01/id_3/recursion/101/lc_101_v2.py new file mode 100644 index 00000000..19a463bc --- /dev/null +++ b/Week_01/id_3/recursion/101/lc_101_v2.py @@ -0,0 +1,24 @@ +""" + 参考答案 两颗子树的对称比较,除了比较根节点外,还要比较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): + 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/lc_101_v3.py b/Week_01/id_3/recursion/101/lc_101_v3.py new file mode 100644 index 00000000..0be05ef4 --- /dev/null +++ b/Week_01/id_3/recursion/101/lc_101_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]) From ac139cb845c1c6ee6fa72fcaec867a77f4c3a17e Mon Sep 17 00:00:00 2001 From: yujingwen Date: Mon, 10 Jun 2019 14:28:32 +0800 Subject: [PATCH 32/75] add simple bs --- Week_01/id_3/bs/bs_basis.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 Week_01/id_3/bs/bs_basis.py 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..862a5d40 --- /dev/null +++ b/Week_01/id_3/bs/bs_basis.py @@ -0,0 +1,19 @@ +def bs(nums, x): + low = 0 + high = len(nums) - 1 + + while low <= high: + mid = low + int((high - low)/2) + if nums[mid] == x: + return mid + if nums[mid] > x: + high = mid - 1 + else: + low = mid + 1 + return -1 + + +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) From 0935325952919a6c11cec43de3314c7c23e3a092 Mon Sep 17 00:00:00 2001 From: yujingwen Date: Mon, 10 Jun 2019 17:34:09 +0800 Subject: [PATCH 33/75] rename file name --- .../15/{lc_15_v1.py => LeetCode_15_3_v1.py} | 0 .../15/{lc_15_v2.py => LeetCode_15_3_v2.py} | 0 .../189/{lc_189_v1.py => LeetCode_189_3_v1.py} | 0 .../189/{lc_189_v2.py => LeetCode_189_3_v2.py} | 0 .../26/{lc_26_v1.py => LeetCode_26_3_v1.py} | 0 .../88/{lc_88_v1.py => LeetCode_88_3_v1.py} | 0 .../88/{lc_88_v2.py => LeetCode_88_3_v2.py} | 0 .../441/{lc_441_v1.py => LeetCode_441_3_v1.py} | 0 .../441/{lc_441_v2.py => LeetCode_441_3_v2.py} | 0 Week_01/id_3/bs/bs_basis.py | 16 +++++----------- .../242/{lc_242_v1.py => LeetCode_242_3_v1.py} | 0 .../hash/49/{lc_49_v1.py => LeetCode_49_3_v1.py} | 0 .../21/{lc_21_v1.py => LeetCode_21_3_v1.py} | 0 .../21/{lc_21_v2.py => LeetCode_21_3_v2.py} | 0 .../24/{lc_24_v1.py => LeetCode_24_3_v1.py} | 0 .../24/{lc_24_v2.py => LeetCode_24_3_v2.py} | 0 .../101/{lc_101_v1.py => LeetCode_101_3_v1.py} | 0 .../101/{lc_101_v2.py => LeetCode_101_3_v2.py} | 0 .../101/{lc_101_v3.py => LeetCode_101_3_v3.py} | 0 .../104/{lc_104_v1.py => LeetCode_104_3_v1.py} | 0 .../236/{lc_236_v1.py => LeetCode_236_3_v1.py} | 0 .../322/{lc_322_v1.py => LeetCode_322_3_v1.py} | 0 .../{lc_1021_v1.py => LeetCode_1021_3_v1.py} | 0 .../{lc_1021_v2.py => LeetCode_1021_3_v2.py} | 0 .../{lc_1047_v1.py => LeetCode_1047_3_v1.py} | 0 25 files changed, 5 insertions(+), 11 deletions(-) rename Week_01/id_3/array/15/{lc_15_v1.py => LeetCode_15_3_v1.py} (100%) rename Week_01/id_3/array/15/{lc_15_v2.py => LeetCode_15_3_v2.py} (100%) rename Week_01/id_3/array/189/{lc_189_v1.py => LeetCode_189_3_v1.py} (100%) rename Week_01/id_3/array/189/{lc_189_v2.py => LeetCode_189_3_v2.py} (100%) rename Week_01/id_3/array/26/{lc_26_v1.py => LeetCode_26_3_v1.py} (100%) rename Week_01/id_3/array/88/{lc_88_v1.py => LeetCode_88_3_v1.py} (100%) rename Week_01/id_3/array/88/{lc_88_v2.py => LeetCode_88_3_v2.py} (100%) rename Week_01/id_3/bs/441/{lc_441_v1.py => LeetCode_441_3_v1.py} (100%) rename Week_01/id_3/bs/441/{lc_441_v2.py => LeetCode_441_3_v2.py} (100%) rename Week_01/id_3/hash/242/{lc_242_v1.py => LeetCode_242_3_v1.py} (100%) rename Week_01/id_3/hash/49/{lc_49_v1.py => LeetCode_49_3_v1.py} (100%) rename Week_01/id_3/linked/21/{lc_21_v1.py => LeetCode_21_3_v1.py} (100%) rename Week_01/id_3/linked/21/{lc_21_v2.py => LeetCode_21_3_v2.py} (100%) rename Week_01/id_3/linked/24/{lc_24_v1.py => LeetCode_24_3_v1.py} (100%) rename Week_01/id_3/linked/24/{lc_24_v2.py => LeetCode_24_3_v2.py} (100%) rename Week_01/id_3/recursion/101/{lc_101_v1.py => LeetCode_101_3_v1.py} (100%) rename Week_01/id_3/recursion/101/{lc_101_v2.py => LeetCode_101_3_v2.py} (100%) rename Week_01/id_3/recursion/101/{lc_101_v3.py => LeetCode_101_3_v3.py} (100%) rename Week_01/id_3/recursion/104/{lc_104_v1.py => LeetCode_104_3_v1.py} (100%) rename Week_01/id_3/recursion/236/{lc_236_v1.py => LeetCode_236_3_v1.py} (100%) rename Week_01/id_3/recursion/322/{lc_322_v1.py => LeetCode_322_3_v1.py} (100%) rename Week_01/id_3/stack_queue/1021/{lc_1021_v1.py => LeetCode_1021_3_v1.py} (100%) rename Week_01/id_3/stack_queue/1021/{lc_1021_v2.py => LeetCode_1021_3_v2.py} (100%) rename Week_01/id_3/stack_queue/1047/{lc_1047_v1.py => LeetCode_1047_3_v1.py} (100%) diff --git a/Week_01/id_3/array/15/lc_15_v1.py b/Week_01/id_3/array/15/LeetCode_15_3_v1.py similarity index 100% rename from Week_01/id_3/array/15/lc_15_v1.py rename to Week_01/id_3/array/15/LeetCode_15_3_v1.py diff --git a/Week_01/id_3/array/15/lc_15_v2.py b/Week_01/id_3/array/15/LeetCode_15_3_v2.py similarity index 100% rename from Week_01/id_3/array/15/lc_15_v2.py rename to Week_01/id_3/array/15/LeetCode_15_3_v2.py diff --git a/Week_01/id_3/array/189/lc_189_v1.py b/Week_01/id_3/array/189/LeetCode_189_3_v1.py similarity index 100% rename from Week_01/id_3/array/189/lc_189_v1.py rename to Week_01/id_3/array/189/LeetCode_189_3_v1.py diff --git a/Week_01/id_3/array/189/lc_189_v2.py b/Week_01/id_3/array/189/LeetCode_189_3_v2.py similarity index 100% rename from Week_01/id_3/array/189/lc_189_v2.py rename to Week_01/id_3/array/189/LeetCode_189_3_v2.py diff --git a/Week_01/id_3/array/26/lc_26_v1.py b/Week_01/id_3/array/26/LeetCode_26_3_v1.py similarity index 100% rename from Week_01/id_3/array/26/lc_26_v1.py rename to Week_01/id_3/array/26/LeetCode_26_3_v1.py diff --git a/Week_01/id_3/array/88/lc_88_v1.py b/Week_01/id_3/array/88/LeetCode_88_3_v1.py similarity index 100% rename from Week_01/id_3/array/88/lc_88_v1.py rename to Week_01/id_3/array/88/LeetCode_88_3_v1.py diff --git a/Week_01/id_3/array/88/lc_88_v2.py b/Week_01/id_3/array/88/LeetCode_88_3_v2.py similarity index 100% rename from Week_01/id_3/array/88/lc_88_v2.py rename to Week_01/id_3/array/88/LeetCode_88_3_v2.py diff --git a/Week_01/id_3/bs/441/lc_441_v1.py b/Week_01/id_3/bs/441/LeetCode_441_3_v1.py similarity index 100% rename from Week_01/id_3/bs/441/lc_441_v1.py rename to Week_01/id_3/bs/441/LeetCode_441_3_v1.py diff --git a/Week_01/id_3/bs/441/lc_441_v2.py b/Week_01/id_3/bs/441/LeetCode_441_3_v2.py similarity index 100% rename from Week_01/id_3/bs/441/lc_441_v2.py rename to Week_01/id_3/bs/441/LeetCode_441_3_v2.py diff --git a/Week_01/id_3/bs/bs_basis.py b/Week_01/id_3/bs/bs_basis.py index 862a5d40..331a2d09 100644 --- a/Week_01/id_3/bs/bs_basis.py +++ b/Week_01/id_3/bs/bs_basis.py @@ -1,16 +1,10 @@ def bs(nums, x): + if not nums: + return -1 + length = len(nums) low = 0 - high = len(nums) - 1 - - while low <= high: - mid = low + int((high - low)/2) - if nums[mid] == x: - return mid - if nums[mid] > x: - high = mid - 1 - else: - low = mid + 1 - return -1 + high = length - 1 + print(bs([8, 11, 19, 23, 27, 33, 45, 55, 67, 98], 19) == 2) diff --git a/Week_01/id_3/hash/242/lc_242_v1.py b/Week_01/id_3/hash/242/LeetCode_242_3_v1.py similarity index 100% rename from Week_01/id_3/hash/242/lc_242_v1.py rename to Week_01/id_3/hash/242/LeetCode_242_3_v1.py diff --git a/Week_01/id_3/hash/49/lc_49_v1.py b/Week_01/id_3/hash/49/LeetCode_49_3_v1.py similarity index 100% rename from Week_01/id_3/hash/49/lc_49_v1.py rename to Week_01/id_3/hash/49/LeetCode_49_3_v1.py diff --git a/Week_01/id_3/linked/21/lc_21_v1.py b/Week_01/id_3/linked/21/LeetCode_21_3_v1.py similarity index 100% rename from Week_01/id_3/linked/21/lc_21_v1.py rename to Week_01/id_3/linked/21/LeetCode_21_3_v1.py diff --git a/Week_01/id_3/linked/21/lc_21_v2.py b/Week_01/id_3/linked/21/LeetCode_21_3_v2.py similarity index 100% rename from Week_01/id_3/linked/21/lc_21_v2.py rename to Week_01/id_3/linked/21/LeetCode_21_3_v2.py diff --git a/Week_01/id_3/linked/24/lc_24_v1.py b/Week_01/id_3/linked/24/LeetCode_24_3_v1.py similarity index 100% rename from Week_01/id_3/linked/24/lc_24_v1.py rename to Week_01/id_3/linked/24/LeetCode_24_3_v1.py diff --git a/Week_01/id_3/linked/24/lc_24_v2.py b/Week_01/id_3/linked/24/LeetCode_24_3_v2.py similarity index 100% rename from Week_01/id_3/linked/24/lc_24_v2.py rename to Week_01/id_3/linked/24/LeetCode_24_3_v2.py diff --git a/Week_01/id_3/recursion/101/lc_101_v1.py b/Week_01/id_3/recursion/101/LeetCode_101_3_v1.py similarity index 100% rename from Week_01/id_3/recursion/101/lc_101_v1.py rename to Week_01/id_3/recursion/101/LeetCode_101_3_v1.py diff --git a/Week_01/id_3/recursion/101/lc_101_v2.py b/Week_01/id_3/recursion/101/LeetCode_101_3_v2.py similarity index 100% rename from Week_01/id_3/recursion/101/lc_101_v2.py rename to Week_01/id_3/recursion/101/LeetCode_101_3_v2.py diff --git a/Week_01/id_3/recursion/101/lc_101_v3.py b/Week_01/id_3/recursion/101/LeetCode_101_3_v3.py similarity index 100% rename from Week_01/id_3/recursion/101/lc_101_v3.py rename to Week_01/id_3/recursion/101/LeetCode_101_3_v3.py diff --git a/Week_01/id_3/recursion/104/lc_104_v1.py b/Week_01/id_3/recursion/104/LeetCode_104_3_v1.py similarity index 100% rename from Week_01/id_3/recursion/104/lc_104_v1.py rename to Week_01/id_3/recursion/104/LeetCode_104_3_v1.py diff --git a/Week_01/id_3/recursion/236/lc_236_v1.py b/Week_01/id_3/recursion/236/LeetCode_236_3_v1.py similarity index 100% rename from Week_01/id_3/recursion/236/lc_236_v1.py rename to Week_01/id_3/recursion/236/LeetCode_236_3_v1.py diff --git a/Week_01/id_3/recursion/322/lc_322_v1.py b/Week_01/id_3/recursion/322/LeetCode_322_3_v1.py similarity index 100% rename from Week_01/id_3/recursion/322/lc_322_v1.py rename to Week_01/id_3/recursion/322/LeetCode_322_3_v1.py diff --git a/Week_01/id_3/stack_queue/1021/lc_1021_v1.py b/Week_01/id_3/stack_queue/1021/LeetCode_1021_3_v1.py similarity index 100% rename from Week_01/id_3/stack_queue/1021/lc_1021_v1.py rename to Week_01/id_3/stack_queue/1021/LeetCode_1021_3_v1.py diff --git a/Week_01/id_3/stack_queue/1021/lc_1021_v2.py b/Week_01/id_3/stack_queue/1021/LeetCode_1021_3_v2.py similarity index 100% rename from Week_01/id_3/stack_queue/1021/lc_1021_v2.py rename to Week_01/id_3/stack_queue/1021/LeetCode_1021_3_v2.py diff --git a/Week_01/id_3/stack_queue/1047/lc_1047_v1.py b/Week_01/id_3/stack_queue/1047/LeetCode_1047_3_v1.py similarity index 100% rename from Week_01/id_3/stack_queue/1047/lc_1047_v1.py rename to Week_01/id_3/stack_queue/1047/LeetCode_1047_3_v1.py From 5786807540e71d4a8729281409f6c302b9312d1b Mon Sep 17 00:00:00 2001 From: yujingwen Date: Mon, 10 Jun 2019 23:28:53 +0800 Subject: [PATCH 34/75] =?UTF-8?q?add=20bs=5Ffirst=20=E8=B0=83=E8=AF=95?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_01/id_3/NOTE.md | 4 ++++ Week_01/id_3/bs/bs_basis.py | 38 ++++++++++++++++++++++++++++++++++++- 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/Week_01/id_3/NOTE.md b/Week_01/id_3/NOTE.md index f6890693..3e485dc6 100644 --- a/Week_01/id_3/NOTE.md +++ b/Week_01/id_3/NOTE.md @@ -8,3 +8,7 @@ l1, l2 = l2, l1 两个变量没有顺序要求,我们可以通过预处理的方式,强制变成有先后关系,这就避免了维护一个中间标量的尴尬 python的异或实现 bool(n1) != bool(n2) js也可以参考 + + +DP 子问题有最优解 -> 全局最优解 找到最优子结构即可向上递推 +递归 可以遍历所有解,这个是DP做不到的 diff --git a/Week_01/id_3/bs/bs_basis.py b/Week_01/id_3/bs/bs_basis.py index 331a2d09..39234132 100644 --- a/Week_01/id_3/bs/bs_basis.py +++ b/Week_01/id_3/bs/bs_basis.py @@ -4,10 +4,46 @@ def bs(nums, x): 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 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) From 56a3219c07593d37c13806a93360aeb13eea5234 Mon Sep 17 00:00:00 2001 From: yujingwen Date: Wed, 12 Jun 2019 03:27:44 +0800 Subject: [PATCH 35/75] =?UTF-8?q?=E5=85=88=E7=94=A8=E6=9E=81=E5=85=B6?= =?UTF-8?q?=E4=B8=91=E9=99=8B=E7=9A=84=E4=BB=A3=E7=A0=81=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E4=B8=80=E4=B8=8B726=20=E6=9C=89=E5=BE=85=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_02/id_3/hash/LeetCode_726_3.py | 80 +++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 Week_02/id_3/hash/LeetCode_726_3.py diff --git a/Week_02/id_3/hash/LeetCode_726_3.py b/Week_02/id_3/hash/LeetCode_726_3.py new file mode 100644 index 00000000..cd7fe5d3 --- /dev/null +++ b/Week_02/id_3/hash/LeetCode_726_3.py @@ -0,0 +1,80 @@ +n0, n9 = ord('0'), ord('9') +a, z = ord('a'), ord('z') +A, Z = ord('A'), ord('Z') + +STATUS_INIT = 0 +STATUS_ATOM = 1 +STATUS_NUMBER = 2 + + +class Solution: + def countOfAtoms(self, formula: str) -> str: + stack = [] + atom_map = {} + cur_map = {} + status = STATUS_INIT + letter_list = [] + for c in formula: + if c == '(' or c == ')': + self.handle(letter_list, status, cur_map) + self.merge_map(atom_map, cur_map) + if c == '(': + stack.append(atom_map) + atom_map = {} + continue + elif c == ')': + self.handle(letter_list, status, cur_map) + self.merge_map(atom_map, cur_map) + cur_map = atom_map + atom_map = stack.pop() + status = STATUS_INIT + continue + + v = ord(c) + if A <= v <= Z: + self.handle(letter_list, status, cur_map) + self.merge_map(atom_map, cur_map) + status = STATUS_ATOM + elif n0 <= v <= n9: + if status != STATUS_NUMBER: + self.handle(letter_list, status, cur_map) + status = STATUS_NUMBER + + letter_list.append(c) + + self.handle(letter_list, status, cur_map) + self.merge_map(atom_map, cur_map) + + r = [] + for k in sorted(atom_map.keys()): + v = atom_map[k] + r.append('%s%s' % (k, v if v!= 1 else '')) + return ''.join(r) + + def handle(self, letter_list, status, cur_map): + if not letter_list: + return + + s = ''.join(letter_list) + if status == STATUS_NUMBER: + n = int(s) + for (k, v) in cur_map.items(): + cur_map[k] = v * n + elif status == STATUS_ATOM: + cur_map[s] = 1 + + letter_list.clear() + + def merge_map(self, m1, m2): + if not m2: + return m1 + for (k, v) in m2.items(): + m1[k] = m1.get(k, 0) + v + m2.clear() + return m1 + + +s1 = Solution() +print(s1.countOfAtoms('H2O') == 'H2O') +print(s1.countOfAtoms('Mg(OH)2') == 'H2MgO2') +print(s1.countOfAtoms('K4(ON(SO3)2)2') == 'K4N2O14S4') From a8a78b68e88ae8835f0964cd6ca6120336d89a4a Mon Sep 17 00:00:00 2001 From: yujingwen Date: Wed, 12 Jun 2019 14:26:57 +0800 Subject: [PATCH 36/75] =?UTF-8?q?=E5=88=A0=E6=8E=89=E9=83=A8=E5=88=86?= =?UTF-8?q?=E5=86=97=E4=BD=99=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../id_3/hash/{LeetCode_726_3.py => 726/LeetCode_726_3_v1.py} | 2 -- 1 file changed, 2 deletions(-) rename Week_02/id_3/hash/{LeetCode_726_3.py => 726/LeetCode_726_3_v1.py} (94%) diff --git a/Week_02/id_3/hash/LeetCode_726_3.py b/Week_02/id_3/hash/726/LeetCode_726_3_v1.py similarity index 94% rename from Week_02/id_3/hash/LeetCode_726_3.py rename to Week_02/id_3/hash/726/LeetCode_726_3_v1.py index cd7fe5d3..7758f889 100644 --- a/Week_02/id_3/hash/LeetCode_726_3.py +++ b/Week_02/id_3/hash/726/LeetCode_726_3_v1.py @@ -23,8 +23,6 @@ def countOfAtoms(self, formula: str) -> str: atom_map = {} continue elif c == ')': - self.handle(letter_list, status, cur_map) - self.merge_map(atom_map, cur_map) cur_map = atom_map atom_map = stack.pop() status = STATUS_INIT From 98ad2d5743d998224e8186292db062db843a2937 Mon Sep 17 00:00:00 2001 From: yujingwen Date: Wed, 12 Jun 2019 14:43:30 +0800 Subject: [PATCH 37/75] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E7=BB=86=E8=8A=82?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_02/id_3/hash/726/LeetCode_726_3_v1.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Week_02/id_3/hash/726/LeetCode_726_3_v1.py b/Week_02/id_3/hash/726/LeetCode_726_3_v1.py index 7758f889..aff9349d 100644 --- a/Week_02/id_3/hash/726/LeetCode_726_3_v1.py +++ b/Week_02/id_3/hash/726/LeetCode_726_3_v1.py @@ -46,7 +46,7 @@ def countOfAtoms(self, formula: str) -> str: r = [] for k in sorted(atom_map.keys()): v = atom_map[k] - r.append('%s%s' % (k, v if v!= 1 else '')) + r.append('%s%s' % (k, v if v != 1 else '')) return ''.join(r) def handle(self, letter_list, status, cur_map): From 845f675744570bedacb5b99b9aae299c29de4384 Mon Sep 17 00:00:00 2001 From: yujingwen Date: Thu, 13 Jun 2019 03:32:45 +0800 Subject: [PATCH 38/75] =?UTF-8?q?726=20=E5=8A=A0=E5=85=A5=E9=80=92?= =?UTF-8?q?=E5=BD=92=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_02/id_3/NOTE.md | 1 + Week_02/id_3/hash/726/LeetCode_726_3_v1.py | 5 -- Week_02/id_3/hash/726/LeetCode_726_3_v2.py | 83 ++++++++++++++++++++++ Week_02/id_3/hash/726/test_726.py | 10 +++ 4 files changed, 94 insertions(+), 5 deletions(-) create mode 100644 Week_02/id_3/hash/726/LeetCode_726_3_v2.py create mode 100644 Week_02/id_3/hash/726/test_726.py diff --git a/Week_02/id_3/NOTE.md b/Week_02/id_3/NOTE.md index 107ea7d6..5a9596e6 100644 --- a/Week_02/id_3/NOTE.md +++ b/Week_02/id_3/NOTE.md @@ -1 +1,2 @@ # 学习笔记 +Iterator diff --git a/Week_02/id_3/hash/726/LeetCode_726_3_v1.py b/Week_02/id_3/hash/726/LeetCode_726_3_v1.py index aff9349d..cfd87755 100644 --- a/Week_02/id_3/hash/726/LeetCode_726_3_v1.py +++ b/Week_02/id_3/hash/726/LeetCode_726_3_v1.py @@ -71,8 +71,3 @@ def merge_map(self, m1, m2): m2.clear() return m1 - -s1 = Solution() -print(s1.countOfAtoms('H2O') == 'H2O') -print(s1.countOfAtoms('Mg(OH)2') == 'H2MgO2') -print(s1.countOfAtoms('K4(ON(SO3)2)2') == 'K4N2O14S4') diff --git a/Week_02/id_3/hash/726/LeetCode_726_3_v2.py b/Week_02/id_3/hash/726/LeetCode_726_3_v2.py new file mode 100644 index 00000000..b96baa89 --- /dev/null +++ b/Week_02/id_3/hash/726/LeetCode_726_3_v2.py @@ -0,0 +1,83 @@ +n0, n9 = ord('0'), ord('9') +a, z = ord('a'), ord('z') +A, Z = ord('A'), ord('Z') + +STATUS_INIT = 0 +STATUS_ATOM = 1 +STATUS_NUMBER = 2 + + +class Solution: + def countOfAtoms(self, formula: str) -> str: + atom_map = self.parse(iter(formula)) + r = [] + for k in sorted(atom_map.keys()): + r.append(k) + v = atom_map[k] + r.append(str(v) if v != 1 else '') + return ''.join(r) + + def parse(self, iterator) -> dict: + atom_map = {} + cur_map = {} + letters = [] + status = STATUS_ATOM + while True: + try: + c = next(iterator) + if ')' == c: + break + + if '(' == c: + self.handle(cur_map, letters, status) + self.merge(atom_map, cur_map) + cur_map = self.parse(iterator) + continue + + v = ord(c) + + if A <= v <= Z: + self.handle(cur_map, letters, status) + self.merge(atom_map, cur_map) + status = STATUS_ATOM + elif n0 <= v <= n9 and status != STATUS_NUMBER: + self.handle(cur_map, letters, status) + status = STATUS_NUMBER + + letters.append(c) + + except StopIteration: + break + + self.handle(cur_map, letters, status) + self.merge(atom_map, cur_map) + return atom_map + + def letters(self, letters): + r = ''.join(letters) + letters.clear() + return r + + def atom(self, cur_map, letters): + cur_map[self.letters(letters)] = 1 + + def numbers(self, cur_map, letters): + numbers = int(self.letters(letters)) + for (k, v) in cur_map.items(): + cur_map[k] = v * numbers + + def handle(self, cur_map, letters, status): + if not letters: + return + if status == STATUS_NUMBER: + self.numbers(cur_map, letters) + else: + self.atom(cur_map, letters) + + def merge(self, atom_map, cur_map): + if not cur_map: + return + for (k, v) in cur_map.items(): + atom_map[k] = atom_map.get(k, 0) + v + + cur_map.clear() diff --git a/Week_02/id_3/hash/726/test_726.py b/Week_02/id_3/hash/726/test_726.py new file mode 100644 index 00000000..244414e5 --- /dev/null +++ b/Week_02/id_3/hash/726/test_726.py @@ -0,0 +1,10 @@ +import LeetCode_726_3_v1 +import LeetCode_726_3_v2 + +# Solution = LeetCode_726_3_v1.Solution +Solution = LeetCode_726_3_v2.Solution + +s1 = Solution() +print(s1.countOfAtoms('H2O') == 'H2O') +print(s1.countOfAtoms('Mg(OH)2') == 'H2MgO2') +print(s1.countOfAtoms('K4(ON(SO3)2)2') == 'K4N2O14S4') From 0d77912f38d17dae74c276a9da96220121fb1ecc Mon Sep 17 00:00:00 2001 From: yujingwen Date: Thu, 13 Jun 2019 05:02:20 +0800 Subject: [PATCH 39/75] =?UTF-8?q?297=20=E9=80=92=E5=BD=92=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=20=E8=B6=85=E6=97=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_02/id_3/tree/LeetCode_297_3_v1.py | 44 ++++++++++++++++++++++++++ Week_02/id_3/tree/test_297.py | 13 ++++++++ 2 files changed, 57 insertions(+) create mode 100644 Week_02/id_3/tree/LeetCode_297_3_v1.py create mode 100644 Week_02/id_3/tree/test_297.py diff --git a/Week_02/id_3/tree/LeetCode_297_3_v1.py b/Week_02/id_3/tree/LeetCode_297_3_v1.py new file mode 100644 index 00000000..99386af9 --- /dev/null +++ b/Week_02/id_3/tree/LeetCode_297_3_v1.py @@ -0,0 +1,44 @@ +class TreeNode(object): + def __init__(self, x): + self.val = x + self.left = None + self.right = None + + +class Codec: + + def serialize(self, root): + if not root: + return [] + data = [None] + self._s(root, 1, data) + return data[1:] + + def _s(self, node, i, data): + if not node: + return + length = len(data) + if i >= length: + for n in range(i - length + 1): + data.append(None) + data[i] = node.val + self._s(node.left, 2*i, data) + self._s(node.right, 2*i+1, data) + + def deserialize(self, data): + if data is None: + return None + data.insert(0, None) + return self._de(1, data) + + def _de(self, i, data): + if i >= len(data): + return None + v = data[i] + if v is None: + return None + node = TreeNode(v) + i = 2 * i + node.left = self._de(i, data) + node.right = self._de(i + 1, data) + return node diff --git a/Week_02/id_3/tree/test_297.py b/Week_02/id_3/tree/test_297.py new file mode 100644 index 00000000..cb311bec --- /dev/null +++ b/Week_02/id_3/tree/test_297.py @@ -0,0 +1,13 @@ +import LeetCode_297_3_v1 + +Codec = LeetCode_297_3_v1.Codec + +codec = Codec() + + +def check(nums): + r = codec.serialize(codec.deserialize(nums)) + print(r, r == nums) + + +check([1, 2, 3, None, None, 4, 5]) From 09148e39e916b149cd03efa15041d6c56e071421 Mon Sep 17 00:00:00 2001 From: yujingwen Date: Thu, 13 Jun 2019 05:22:52 +0800 Subject: [PATCH 40/75] =?UTF-8?q?297=20=E6=88=91=E5=AE=8C=E5=85=A8?= =?UTF-8?q?=E7=90=86=E8=A7=A3=E9=94=99=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_02/id_3/tree/LeetCode_297_3_v1.py | 12 +- Week_02/id_3/tree/test_297.py | 2002 ++++++++++++++++++++++++ 2 files changed, 2009 insertions(+), 5 deletions(-) diff --git a/Week_02/id_3/tree/LeetCode_297_3_v1.py b/Week_02/id_3/tree/LeetCode_297_3_v1.py index 99386af9..04ddf847 100644 --- a/Week_02/id_3/tree/LeetCode_297_3_v1.py +++ b/Week_02/id_3/tree/LeetCode_297_3_v1.py @@ -10,21 +10,23 @@ class Codec: def serialize(self, root): if not root: return [] - data = [None] + print(self.length(root, 1)) + data = [None] * (self.length(root, 1) + 1) self._s(root, 1, data) return data[1:] def _s(self, node, i, data): if not node: return - length = len(data) - if i >= length: - for n in range(i - length + 1): - data.append(None) data[i] = node.val self._s(node.left, 2*i, data) self._s(node.right, 2*i+1, data) + def length(self, node, i): + if not node: + return 0 + return max(i, self.length(node.left, 2*i), self.length(node.right, 2*i+1)) + def deserialize(self, data): if data is None: return None diff --git a/Week_02/id_3/tree/test_297.py b/Week_02/id_3/tree/test_297.py index cb311bec..def2eabc 100644 --- a/Week_02/id_3/tree/test_297.py +++ b/Week_02/id_3/tree/test_297.py @@ -6,8 +6,2010 @@ def check(nums): + print(len(nums)) r = codec.serialize(codec.deserialize(nums)) print(r, r == nums) check([1, 2, 3, None, None, 4, 5]) +check([ + 1, + None, + 2, + None, + 3, + None, + 4, + None, + 5, + None, + 6, + None, + 7, + None, + 8, + None, + 9, + None, + 10, + None, + 11, + None, + 12, + None, + 13, + None, + 14, + None, + 15, + None, + 16, + None, + 17, + None, + 18, + None, + 19, + None, + 20, + None, + 21, + None, + 22, + None, + 23, + None, + 24, + None, + 25, + None, + 26, + None, + 27, + None, + 28, + None, + 29, + None, + 30, + None, + 31, + None, + 32, + None, + 33, + None, + 34, + None, + 35, + None, + 36, + None, + 37, + None, + 38, + None, + 39, + None, + 40, + None, + 41, + None, + 42, + None, + 43, + None, + 44, + None, + 45, + None, + 46, + None, + 47, + None, + 48, + None, + 49, + None, + 50, + None, + 51, + None, + 52, + None, + 53, + None, + 54, + None, + 55, + None, + 56, + None, + 57, + None, + 58, + None, + 59, + None, + 60, + None, + 61, + None, + 62, + None, + 63, + None, + 64, + None, + 65, + None, + 66, + None, + 67, + None, + 68, + None, + 69, + None, + 70, + None, + 71, + None, + 72, + None, + 73, + None, + 74, + None, + 75, + None, + 76, + None, + 77, + None, + 78, + None, + 79, + None, + 80, + None, + 81, + None, + 82, + None, + 83, + None, + 84, + None, + 85, + None, + 86, + None, + 87, + None, + 88, + None, + 89, + None, + 90, + None, + 91, + None, + 92, + None, + 93, + None, + 94, + None, + 95, + None, + 96, + None, + 97, + None, + 98, + None, + 99, + None, + 100, + None, + 101, + None, + 102, + None, + 103, + None, + 104, + None, + 105, + None, + 106, + None, + 107, + None, + 108, + None, + 109, + None, + 110, + None, + 111, + None, + 112, + None, + 113, + None, + 114, + None, + 115, + None, + 116, + None, + 117, + None, + 118, + None, + 119, + None, + 120, + None, + 121, + None, + 122, + None, + 123, + None, + 124, + None, + 125, + None, + 126, + None, + 127, + None, + 128, + None, + 129, + None, + 130, + None, + 131, + None, + 132, + None, + 133, + None, + 134, + None, + 135, + None, + 136, + None, + 137, + None, + 138, + None, + 139, + None, + 140, + None, + 141, + None, + 142, + None, + 143, + None, + 144, + None, + 145, + None, + 146, + None, + 147, + None, + 148, + None, + 149, + None, + 150, + None, + 151, + None, + 152, + None, + 153, + None, + 154, + None, + 155, + None, + 156, + None, + 157, + None, + 158, + None, + 159, + None, + 160, + None, + 161, + None, + 162, + None, + 163, + None, + 164, + None, + 165, + None, + 166, + None, + 167, + None, + 168, + None, + 169, + None, + 170, + None, + 171, + None, + 172, + None, + 173, + None, + 174, + None, + 175, + None, + 176, + None, + 177, + None, + 178, + None, + 179, + None, + 180, + None, + 181, + None, + 182, + None, + 183, + None, + 184, + None, + 185, + None, + 186, + None, + 187, + None, + 188, + None, + 189, + None, + 190, + None, + 191, + None, + 192, + None, + 193, + None, + 194, + None, + 195, + None, + 196, + None, + 197, + None, + 198, + None, + 199, + None, + 200, + None, + 201, + None, + 202, + None, + 203, + None, + 204, + None, + 205, + None, + 206, + None, + 207, + None, + 208, + None, + 209, + None, + 210, + None, + 211, + None, + 212, + None, + 213, + None, + 214, + None, + 215, + None, + 216, + None, + 217, + None, + 218, + None, + 219, + None, + 220, + None, + 221, + None, + 222, + None, + 223, + None, + 224, + None, + 225, + None, + 226, + None, + 227, + None, + 228, + None, + 229, + None, + 230, + None, + 231, + None, + 232, + None, + 233, + None, + 234, + None, + 235, + None, + 236, + None, + 237, + None, + 238, + None, + 239, + None, + 240, + None, + 241, + None, + 242, + None, + 243, + None, + 244, + None, + 245, + None, + 246, + None, + 247, + None, + 248, + None, + 249, + None, + 250, + None, + 251, + None, + 252, + None, + 253, + None, + 254, + None, + 255, + None, + 256, + None, + 257, + None, + 258, + None, + 259, + None, + 260, + None, + 261, + None, + 262, + None, + 263, + None, + 264, + None, + 265, + None, + 266, + None, + 267, + None, + 268, + None, + 269, + None, + 270, + None, + 271, + None, + 272, + None, + 273, + None, + 274, + None, + 275, + None, + 276, + None, + 277, + None, + 278, + None, + 279, + None, + 280, + None, + 281, + None, + 282, + None, + 283, + None, + 284, + None, + 285, + None, + 286, + None, + 287, + None, + 288, + None, + 289, + None, + 290, + None, + 291, + None, + 292, + None, + 293, + None, + 294, + None, + 295, + None, + 296, + None, + 297, + None, + 298, + None, + 299, + None, + 300, + None, + 301, + None, + 302, + None, + 303, + None, + 304, + None, + 305, + None, + 306, + None, + 307, + None, + 308, + None, + 309, + None, + 310, + None, + 311, + None, + 312, + None, + 313, + None, + 314, + None, + 315, + None, + 316, + None, + 317, + None, + 318, + None, + 319, + None, + 320, + None, + 321, + None, + 322, + None, + 323, + None, + 324, + None, + 325, + None, + 326, + None, + 327, + None, + 328, + None, + 329, + None, + 330, + None, + 331, + None, + 332, + None, + 333, + None, + 334, + None, + 335, + None, + 336, + None, + 337, + None, + 338, + None, + 339, + None, + 340, + None, + 341, + None, + 342, + None, + 343, + None, + 344, + None, + 345, + None, + 346, + None, + 347, + None, + 348, + None, + 349, + None, + 350, + None, + 351, + None, + 352, + None, + 353, + None, + 354, + None, + 355, + None, + 356, + None, + 357, + None, + 358, + None, + 359, + None, + 360, + None, + 361, + None, + 362, + None, + 363, + None, + 364, + None, + 365, + None, + 366, + None, + 367, + None, + 368, + None, + 369, + None, + 370, + None, + 371, + None, + 372, + None, + 373, + None, + 374, + None, + 375, + None, + 376, + None, + 377, + None, + 378, + None, + 379, + None, + 380, + None, + 381, + None, + 382, + None, + 383, + None, + 384, + None, + 385, + None, + 386, + None, + 387, + None, + 388, + None, + 389, + None, + 390, + None, + 391, + None, + 392, + None, + 393, + None, + 394, + None, + 395, + None, + 396, + None, + 397, + None, + 398, + None, + 399, + None, + 400, + None, + 401, + None, + 402, + None, + 403, + None, + 404, + None, + 405, + None, + 406, + None, + 407, + None, + 408, + None, + 409, + None, + 410, + None, + 411, + None, + 412, + None, + 413, + None, + 414, + None, + 415, + None, + 416, + None, + 417, + None, + 418, + None, + 419, + None, + 420, + None, + 421, + None, + 422, + None, + 423, + None, + 424, + None, + 425, + None, + 426, + None, + 427, + None, + 428, + None, + 429, + None, + 430, + None, + 431, + None, + 432, + None, + 433, + None, + 434, + None, + 435, + None, + 436, + None, + 437, + None, + 438, + None, + 439, + None, + 440, + None, + 441, + None, + 442, + None, + 443, + None, + 444, + None, + 445, + None, + 446, + None, + 447, + None, + 448, + None, + 449, + None, + 450, + None, + 451, + None, + 452, + None, + 453, + None, + 454, + None, + 455, + None, + 456, + None, + 457, + None, + 458, + None, + 459, + None, + 460, + None, + 461, + None, + 462, + None, + 463, + None, + 464, + None, + 465, + None, + 466, + None, + 467, + None, + 468, + None, + 469, + None, + 470, + None, + 471, + None, + 472, + None, + 473, + None, + 474, + None, + 475, + None, + 476, + None, + 477, + None, + 478, + None, + 479, + None, + 480, + None, + 481, + None, + 482, + None, + 483, + None, + 484, + None, + 485, + None, + 486, + None, + 487, + None, + 488, + None, + 489, + None, + 490, + None, + 491, + None, + 492, + None, + 493, + None, + 494, + None, + 495, + None, + 496, + None, + 497, + None, + 498, + None, + 499, + None, + 500, + None, + 501, + None, + 502, + None, + 503, + None, + 504, + None, + 505, + None, + 506, + None, + 507, + None, + 508, + None, + 509, + None, + 510, + None, + 511, + None, + 512, + None, + 513, + None, + 514, + None, + 515, + None, + 516, + None, + 517, + None, + 518, + None, + 519, + None, + 520, + None, + 521, + None, + 522, + None, + 523, + None, + 524, + None, + 525, + None, + 526, + None, + 527, + None, + 528, + None, + 529, + None, + 530, + None, + 531, + None, + 532, + None, + 533, + None, + 534, + None, + 535, + None, + 536, + None, + 537, + None, + 538, + None, + 539, + None, + 540, + None, + 541, + None, + 542, + None, + 543, + None, + 544, + None, + 545, + None, + 546, + None, + 547, + None, + 548, + None, + 549, + None, + 550, + None, + 551, + None, + 552, + None, + 553, + None, + 554, + None, + 555, + None, + 556, + None, + 557, + None, + 558, + None, + 559, + None, + 560, + None, + 561, + None, + 562, + None, + 563, + None, + 564, + None, + 565, + None, + 566, + None, + 567, + None, + 568, + None, + 569, + None, + 570, + None, + 571, + None, + 572, + None, + 573, + None, + 574, + None, + 575, + None, + 576, + None, + 577, + None, + 578, + None, + 579, + None, + 580, + None, + 581, + None, + 582, + None, + 583, + None, + 584, + None, + 585, + None, + 586, + None, + 587, + None, + 588, + None, + 589, + None, + 590, + None, + 591, + None, + 592, + None, + 593, + None, + 594, + None, + 595, + None, + 596, + None, + 597, + None, + 598, + None, + 599, + None, + 600, + None, + 601, + None, + 602, + None, + 603, + None, + 604, + None, + 605, + None, + 606, + None, + 607, + None, + 608, + None, + 609, + None, + 610, + None, + 611, + None, + 612, + None, + 613, + None, + 614, + None, + 615, + None, + 616, + None, + 617, + None, + 618, + None, + 619, + None, + 620, + None, + 621, + None, + 622, + None, + 623, + None, + 624, + None, + 625, + None, + 626, + None, + 627, + None, + 628, + None, + 629, + None, + 630, + None, + 631, + None, + 632, + None, + 633, + None, + 634, + None, + 635, + None, + 636, + None, + 637, + None, + 638, + None, + 639, + None, + 640, + None, + 641, + None, + 642, + None, + 643, + None, + 644, + None, + 645, + None, + 646, + None, + 647, + None, + 648, + None, + 649, + None, + 650, + None, + 651, + None, + 652, + None, + 653, + None, + 654, + None, + 655, + None, + 656, + None, + 657, + None, + 658, + None, + 659, + None, + 660, + None, + 661, + None, + 662, + None, + 663, + None, + 664, + None, + 665, + None, + 666, + None, + 667, + None, + 668, + None, + 669, + None, + 670, + None, + 671, + None, + 672, + None, + 673, + None, + 674, + None, + 675, + None, + 676, + None, + 677, + None, + 678, + None, + 679, + None, + 680, + None, + 681, + None, + 682, + None, + 683, + None, + 684, + None, + 685, + None, + 686, + None, + 687, + None, + 688, + None, + 689, + None, + 690, + None, + 691, + None, + 692, + None, + 693, + None, + 694, + None, + 695, + None, + 696, + None, + 697, + None, + 698, + None, + 699, + None, + 700, + None, + 701, + None, + 702, + None, + 703, + None, + 704, + None, + 705, + None, + 706, + None, + 707, + None, + 708, + None, + 709, + None, + 710, + None, + 711, + None, + 712, + None, + 713, + None, + 714, + None, + 715, + None, + 716, + None, + 717, + None, + 718, + None, + 719, + None, + 720, + None, + 721, + None, + 722, + None, + 723, + None, + 724, + None, + 725, + None, + 726, + None, + 727, + None, + 728, + None, + 729, + None, + 730, + None, + 731, + None, + 732, + None, + 733, + None, + 734, + None, + 735, + None, + 736, + None, + 737, + None, + 738, + None, + 739, + None, + 740, + None, + 741, + None, + 742, + None, + 743, + None, + 744, + None, + 745, + None, + 746, + None, + 747, + None, + 748, + None, + 749, + None, + 750, + None, + 751, + None, + 752, + None, + 753, + None, + 754, + None, + 755, + None, + 756, + None, + 757, + None, + 758, + None, + 759, + None, + 760, + None, + 761, + None, + 762, + None, + 763, + None, + 764, + None, + 765, + None, + 766, + None, + 767, + None, + 768, + None, + 769, + None, + 770, + None, + 771, + None, + 772, + None, + 773, + None, + 774, + None, + 775, + None, + 776, + None, + 777, + None, + 778, + None, + 779, + None, + 780, + None, + 781, + None, + 782, + None, + 783, + None, + 784, + None, + 785, + None, + 786, + None, + 787, + None, + 788, + None, + 789, + None, + 790, + None, + 791, + None, + 792, + None, + 793, + None, + 794, + None, + 795, + None, + 796, + None, + 797, + None, + 798, + None, + 799, + None, + 800, + None, + 801, + None, + 802, + None, + 803, + None, + 804, + None, + 805, + None, + 806, + None, + 807, + None, + 808, + None, + 809, + None, + 810, + None, + 811, + None, + 812, + None, + 813, + None, + 814, + None, + 815, + None, + 816, + None, + 817, + None, + 818, + None, + 819, + None, + 820, + None, + 821, + None, + 822, + None, + 823, + None, + 824, + None, + 825, + None, + 826, + None, + 827, + None, + 828, + None, + 829, + None, + 830, + None, + 831, + None, + 832, + None, + 833, + None, + 834, + None, + 835, + None, + 836, + None, + 837, + None, + 838, + None, + 839, + None, + 840, + None, + 841, + None, + 842, + None, + 843, + None, + 844, + None, + 845, + None, + 846, + None, + 847, + None, + 848, + None, + 849, + None, + 850, + None, + 851, + None, + 852, + None, + 853, + None, + 854, + None, + 855, + None, + 856, + None, + 857, + None, + 858, + None, + 859, + None, + 860, + None, + 861, + None, + 862, + None, + 863, + None, + 864, + None, + 865, + None, + 866, + None, + 867, + None, + 868, + None, + 869, + None, + 870, + None, + 871, + None, + 872, + None, + 873, + None, + 874, + None, + 875, + None, + 876, + None, + 877, + None, + 878, + None, + 879, + None, + 880, + None, + 881, + None, + 882, + None, + 883, + None, + 884, + None, + 885, + None, + 886, + None, + 887, + None, + 888, + None, + 889, + None, + 890, + None, + 891, + None, + 892, + None, + 893, + None, + 894, + None, + 895, + None, + 896, + None, + 897, + None, + 898, + None, + 899, + None, + 900, + None, + 901, + None, + 902, + None, + 903, + None, + 904, + None, + 905, + None, + 906, + None, + 907, + None, + 908, + None, + 909, + None, + 910, + None, + 911, + None, + 912, + None, + 913, + None, + 914, + None, + 915, + None, + 916, + None, + 917, + None, + 918, + None, + 919, + None, + 920, + None, + 921, + None, + 922, + None, + 923, + None, + 924, + None, + 925, + None, + 926, + None, + 927, + None, + 928, + None, + 929, + None, + 930, + None, + 931, + None, + 932, + None, + 933, + None, + 934, + None, + 935, + None, + 936, + None, + 937, + None, + 938, + None, + 939, + None, + 940, + None, + 941, + None, + 942, + None, + 943, + None, + 944, + None, + 945, + None, + 946, + None, + 947, + None, + 948, + None, + 949, + None, + 950, + None, + 951, + None, + 952, + None, + 953, + None, + 954, + None, + 955, + None, + 956, + None, + 957, + None, + 958, + None, + 959, + None, + 960, + None, + 961, + None, + 962, + None, + 963, + None, + 964, + None, + 965, + None, + 966, + None, + 967, + None, + 968, + None, + 969, + None, + 970, + None, + 971, + None, + 972, + None, + 973, + None, + 974, + None, + 975, + None, + 976, + None, + 977, + None, + 978, + None, + 979, + None, + 980, + None, + 981, + None, + 982, + None, + 983, + None, + 984, + None, + 985, + None, + 986, + None, + 987, + None, + 988, + None, + 989, + None, + 990, + None, + 991, + None, + 992, + None, + 993, + None, + 994, + None, + 995, + None, + 996, + None, + 997, + None, + 998, + None, + 999, + None, + 1000 +]) From 192c6bdc5531e9f258d482dbae8693e31effe66d Mon Sep 17 00:00:00 2001 From: yujingwen Date: Thu, 13 Jun 2019 05:44:43 +0800 Subject: [PATCH 41/75] =?UTF-8?q?=E6=80=BB=E7=AE=97=E6=98=AF=E6=95=B4?= =?UTF-8?q?=E5=AF=B9=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_02/id_3/tree/LeetCode_297_3_v1.py | 64 +- Week_02/id_3/tree/test_297.py | 4002 ++++++++++++------------ 2 files changed, 2033 insertions(+), 2033 deletions(-) diff --git a/Week_02/id_3/tree/LeetCode_297_3_v1.py b/Week_02/id_3/tree/LeetCode_297_3_v1.py index 04ddf847..958ff2f5 100644 --- a/Week_02/id_3/tree/LeetCode_297_3_v1.py +++ b/Week_02/id_3/tree/LeetCode_297_3_v1.py @@ -8,39 +8,39 @@ def __init__(self, x): class Codec: def serialize(self, root): - if not root: - return [] - print(self.length(root, 1)) - data = [None] * (self.length(root, 1) + 1) - self._s(root, 1, data) - return data[1:] - - def _s(self, node, i, data): - if not node: - return - data[i] = node.val - self._s(node.left, 2*i, data) - self._s(node.right, 2*i+1, data) - - def length(self, node, i): - if not node: - return 0 - return max(i, self.length(node.left, 2*i), self.length(node.right, 2*i+1)) + data = [] + queue = [root] + none_count = 0 + while len(queue) != 0: + node = queue.pop() + if not node: + none_count += 1 + data.append(None) + continue + + none_count = 0 + data.append(node.val) + queue.insert(0, node.left) + queue.insert(0, node.right) + return data[:-none_count] def deserialize(self, data): - if data is None: + if not data: return None - data.insert(0, None) - return self._de(1, data) - def _de(self, i, data): - if i >= len(data): - return None - v = data[i] - if v is None: - return None - node = TreeNode(v) - i = 2 * i - node.left = self._de(i, data) - node.right = self._de(i + 1, data) - return node + root = TreeNode(data[0]) + queue = [root] + length = len(data) + for i in range(1, length, 2): + node = queue.pop() + if data[i] is not None: + node.left = TreeNode(data[i]) + queue.insert(0, node.left) + + if i + 1 == length: + break + if data[i + 1] is not None: + node.right = TreeNode(data[i + 1]) + queue.insert(0, node.right) + + return root diff --git a/Week_02/id_3/tree/test_297.py b/Week_02/id_3/tree/test_297.py index def2eabc..22bbdb8b 100644 --- a/Week_02/id_3/tree/test_297.py +++ b/Week_02/id_3/tree/test_297.py @@ -12,2004 +12,2004 @@ def check(nums): check([1, 2, 3, None, None, 4, 5]) -check([ - 1, - None, - 2, - None, - 3, - None, - 4, - None, - 5, - None, - 6, - None, - 7, - None, - 8, - None, - 9, - None, - 10, - None, - 11, - None, - 12, - None, - 13, - None, - 14, - None, - 15, - None, - 16, - None, - 17, - None, - 18, - None, - 19, - None, - 20, - None, - 21, - None, - 22, - None, - 23, - None, - 24, - None, - 25, - None, - 26, - None, - 27, - None, - 28, - None, - 29, - None, - 30, - None, - 31, - None, - 32, - None, - 33, - None, - 34, - None, - 35, - None, - 36, - None, - 37, - None, - 38, - None, - 39, - None, - 40, - None, - 41, - None, - 42, - None, - 43, - None, - 44, - None, - 45, - None, - 46, - None, - 47, - None, - 48, - None, - 49, - None, - 50, - None, - 51, - None, - 52, - None, - 53, - None, - 54, - None, - 55, - None, - 56, - None, - 57, - None, - 58, - None, - 59, - None, - 60, - None, - 61, - None, - 62, - None, - 63, - None, - 64, - None, - 65, - None, - 66, - None, - 67, - None, - 68, - None, - 69, - None, - 70, - None, - 71, - None, - 72, - None, - 73, - None, - 74, - None, - 75, - None, - 76, - None, - 77, - None, - 78, - None, - 79, - None, - 80, - None, - 81, - None, - 82, - None, - 83, - None, - 84, - None, - 85, - None, - 86, - None, - 87, - None, - 88, - None, - 89, - None, - 90, - None, - 91, - None, - 92, - None, - 93, - None, - 94, - None, - 95, - None, - 96, - None, - 97, - None, - 98, - None, - 99, - None, - 100, - None, - 101, - None, - 102, - None, - 103, - None, - 104, - None, - 105, - None, - 106, - None, - 107, - None, - 108, - None, - 109, - None, - 110, - None, - 111, - None, - 112, - None, - 113, - None, - 114, - None, - 115, - None, - 116, - None, - 117, - None, - 118, - None, - 119, - None, - 120, - None, - 121, - None, - 122, - None, - 123, - None, - 124, - None, - 125, - None, - 126, - None, - 127, - None, - 128, - None, - 129, - None, - 130, - None, - 131, - None, - 132, - None, - 133, - None, - 134, - None, - 135, - None, - 136, - None, - 137, - None, - 138, - None, - 139, - None, - 140, - None, - 141, - None, - 142, - None, - 143, - None, - 144, - None, - 145, - None, - 146, - None, - 147, - None, - 148, - None, - 149, - None, - 150, - None, - 151, - None, - 152, - None, - 153, - None, - 154, - None, - 155, - None, - 156, - None, - 157, - None, - 158, - None, - 159, - None, - 160, - None, - 161, - None, - 162, - None, - 163, - None, - 164, - None, - 165, - None, - 166, - None, - 167, - None, - 168, - None, - 169, - None, - 170, - None, - 171, - None, - 172, - None, - 173, - None, - 174, - None, - 175, - None, - 176, - None, - 177, - None, - 178, - None, - 179, - None, - 180, - None, - 181, - None, - 182, - None, - 183, - None, - 184, - None, - 185, - None, - 186, - None, - 187, - None, - 188, - None, - 189, - None, - 190, - None, - 191, - None, - 192, - None, - 193, - None, - 194, - None, - 195, - None, - 196, - None, - 197, - None, - 198, - None, - 199, - None, - 200, - None, - 201, - None, - 202, - None, - 203, - None, - 204, - None, - 205, - None, - 206, - None, - 207, - None, - 208, - None, - 209, - None, - 210, - None, - 211, - None, - 212, - None, - 213, - None, - 214, - None, - 215, - None, - 216, - None, - 217, - None, - 218, - None, - 219, - None, - 220, - None, - 221, - None, - 222, - None, - 223, - None, - 224, - None, - 225, - None, - 226, - None, - 227, - None, - 228, - None, - 229, - None, - 230, - None, - 231, - None, - 232, - None, - 233, - None, - 234, - None, - 235, - None, - 236, - None, - 237, - None, - 238, - None, - 239, - None, - 240, - None, - 241, - None, - 242, - None, - 243, - None, - 244, - None, - 245, - None, - 246, - None, - 247, - None, - 248, - None, - 249, - None, - 250, - None, - 251, - None, - 252, - None, - 253, - None, - 254, - None, - 255, - None, - 256, - None, - 257, - None, - 258, - None, - 259, - None, - 260, - None, - 261, - None, - 262, - None, - 263, - None, - 264, - None, - 265, - None, - 266, - None, - 267, - None, - 268, - None, - 269, - None, - 270, - None, - 271, - None, - 272, - None, - 273, - None, - 274, - None, - 275, - None, - 276, - None, - 277, - None, - 278, - None, - 279, - None, - 280, - None, - 281, - None, - 282, - None, - 283, - None, - 284, - None, - 285, - None, - 286, - None, - 287, - None, - 288, - None, - 289, - None, - 290, - None, - 291, - None, - 292, - None, - 293, - None, - 294, - None, - 295, - None, - 296, - None, - 297, - None, - 298, - None, - 299, - None, - 300, - None, - 301, - None, - 302, - None, - 303, - None, - 304, - None, - 305, - None, - 306, - None, - 307, - None, - 308, - None, - 309, - None, - 310, - None, - 311, - None, - 312, - None, - 313, - None, - 314, - None, - 315, - None, - 316, - None, - 317, - None, - 318, - None, - 319, - None, - 320, - None, - 321, - None, - 322, - None, - 323, - None, - 324, - None, - 325, - None, - 326, - None, - 327, - None, - 328, - None, - 329, - None, - 330, - None, - 331, - None, - 332, - None, - 333, - None, - 334, - None, - 335, - None, - 336, - None, - 337, - None, - 338, - None, - 339, - None, - 340, - None, - 341, - None, - 342, - None, - 343, - None, - 344, - None, - 345, - None, - 346, - None, - 347, - None, - 348, - None, - 349, - None, - 350, - None, - 351, - None, - 352, - None, - 353, - None, - 354, - None, - 355, - None, - 356, - None, - 357, - None, - 358, - None, - 359, - None, - 360, - None, - 361, - None, - 362, - None, - 363, - None, - 364, - None, - 365, - None, - 366, - None, - 367, - None, - 368, - None, - 369, - None, - 370, - None, - 371, - None, - 372, - None, - 373, - None, - 374, - None, - 375, - None, - 376, - None, - 377, - None, - 378, - None, - 379, - None, - 380, - None, - 381, - None, - 382, - None, - 383, - None, - 384, - None, - 385, - None, - 386, - None, - 387, - None, - 388, - None, - 389, - None, - 390, - None, - 391, - None, - 392, - None, - 393, - None, - 394, - None, - 395, - None, - 396, - None, - 397, - None, - 398, - None, - 399, - None, - 400, - None, - 401, - None, - 402, - None, - 403, - None, - 404, - None, - 405, - None, - 406, - None, - 407, - None, - 408, - None, - 409, - None, - 410, - None, - 411, - None, - 412, - None, - 413, - None, - 414, - None, - 415, - None, - 416, - None, - 417, - None, - 418, - None, - 419, - None, - 420, - None, - 421, - None, - 422, - None, - 423, - None, - 424, - None, - 425, - None, - 426, - None, - 427, - None, - 428, - None, - 429, - None, - 430, - None, - 431, - None, - 432, - None, - 433, - None, - 434, - None, - 435, - None, - 436, - None, - 437, - None, - 438, - None, - 439, - None, - 440, - None, - 441, - None, - 442, - None, - 443, - None, - 444, - None, - 445, - None, - 446, - None, - 447, - None, - 448, - None, - 449, - None, - 450, - None, - 451, - None, - 452, - None, - 453, - None, - 454, - None, - 455, - None, - 456, - None, - 457, - None, - 458, - None, - 459, - None, - 460, - None, - 461, - None, - 462, - None, - 463, - None, - 464, - None, - 465, - None, - 466, - None, - 467, - None, - 468, - None, - 469, - None, - 470, - None, - 471, - None, - 472, - None, - 473, - None, - 474, - None, - 475, - None, - 476, - None, - 477, - None, - 478, - None, - 479, - None, - 480, - None, - 481, - None, - 482, - None, - 483, - None, - 484, - None, - 485, - None, - 486, - None, - 487, - None, - 488, - None, - 489, - None, - 490, - None, - 491, - None, - 492, - None, - 493, - None, - 494, - None, - 495, - None, - 496, - None, - 497, - None, - 498, - None, - 499, - None, - 500, - None, - 501, - None, - 502, - None, - 503, - None, - 504, - None, - 505, - None, - 506, - None, - 507, - None, - 508, - None, - 509, - None, - 510, - None, - 511, - None, - 512, - None, - 513, - None, - 514, - None, - 515, - None, - 516, - None, - 517, - None, - 518, - None, - 519, - None, - 520, - None, - 521, - None, - 522, - None, - 523, - None, - 524, - None, - 525, - None, - 526, - None, - 527, - None, - 528, - None, - 529, - None, - 530, - None, - 531, - None, - 532, - None, - 533, - None, - 534, - None, - 535, - None, - 536, - None, - 537, - None, - 538, - None, - 539, - None, - 540, - None, - 541, - None, - 542, - None, - 543, - None, - 544, - None, - 545, - None, - 546, - None, - 547, - None, - 548, - None, - 549, - None, - 550, - None, - 551, - None, - 552, - None, - 553, - None, - 554, - None, - 555, - None, - 556, - None, - 557, - None, - 558, - None, - 559, - None, - 560, - None, - 561, - None, - 562, - None, - 563, - None, - 564, - None, - 565, - None, - 566, - None, - 567, - None, - 568, - None, - 569, - None, - 570, - None, - 571, - None, - 572, - None, - 573, - None, - 574, - None, - 575, - None, - 576, - None, - 577, - None, - 578, - None, - 579, - None, - 580, - None, - 581, - None, - 582, - None, - 583, - None, - 584, - None, - 585, - None, - 586, - None, - 587, - None, - 588, - None, - 589, - None, - 590, - None, - 591, - None, - 592, - None, - 593, - None, - 594, - None, - 595, - None, - 596, - None, - 597, - None, - 598, - None, - 599, - None, - 600, - None, - 601, - None, - 602, - None, - 603, - None, - 604, - None, - 605, - None, - 606, - None, - 607, - None, - 608, - None, - 609, - None, - 610, - None, - 611, - None, - 612, - None, - 613, - None, - 614, - None, - 615, - None, - 616, - None, - 617, - None, - 618, - None, - 619, - None, - 620, - None, - 621, - None, - 622, - None, - 623, - None, - 624, - None, - 625, - None, - 626, - None, - 627, - None, - 628, - None, - 629, - None, - 630, - None, - 631, - None, - 632, - None, - 633, - None, - 634, - None, - 635, - None, - 636, - None, - 637, - None, - 638, - None, - 639, - None, - 640, - None, - 641, - None, - 642, - None, - 643, - None, - 644, - None, - 645, - None, - 646, - None, - 647, - None, - 648, - None, - 649, - None, - 650, - None, - 651, - None, - 652, - None, - 653, - None, - 654, - None, - 655, - None, - 656, - None, - 657, - None, - 658, - None, - 659, - None, - 660, - None, - 661, - None, - 662, - None, - 663, - None, - 664, - None, - 665, - None, - 666, - None, - 667, - None, - 668, - None, - 669, - None, - 670, - None, - 671, - None, - 672, - None, - 673, - None, - 674, - None, - 675, - None, - 676, - None, - 677, - None, - 678, - None, - 679, - None, - 680, - None, - 681, - None, - 682, - None, - 683, - None, - 684, - None, - 685, - None, - 686, - None, - 687, - None, - 688, - None, - 689, - None, - 690, - None, - 691, - None, - 692, - None, - 693, - None, - 694, - None, - 695, - None, - 696, - None, - 697, - None, - 698, - None, - 699, - None, - 700, - None, - 701, - None, - 702, - None, - 703, - None, - 704, - None, - 705, - None, - 706, - None, - 707, - None, - 708, - None, - 709, - None, - 710, - None, - 711, - None, - 712, - None, - 713, - None, - 714, - None, - 715, - None, - 716, - None, - 717, - None, - 718, - None, - 719, - None, - 720, - None, - 721, - None, - 722, - None, - 723, - None, - 724, - None, - 725, - None, - 726, - None, - 727, - None, - 728, - None, - 729, - None, - 730, - None, - 731, - None, - 732, - None, - 733, - None, - 734, - None, - 735, - None, - 736, - None, - 737, - None, - 738, - None, - 739, - None, - 740, - None, - 741, - None, - 742, - None, - 743, - None, - 744, - None, - 745, - None, - 746, - None, - 747, - None, - 748, - None, - 749, - None, - 750, - None, - 751, - None, - 752, - None, - 753, - None, - 754, - None, - 755, - None, - 756, - None, - 757, - None, - 758, - None, - 759, - None, - 760, - None, - 761, - None, - 762, - None, - 763, - None, - 764, - None, - 765, - None, - 766, - None, - 767, - None, - 768, - None, - 769, - None, - 770, - None, - 771, - None, - 772, - None, - 773, - None, - 774, - None, - 775, - None, - 776, - None, - 777, - None, - 778, - None, - 779, - None, - 780, - None, - 781, - None, - 782, - None, - 783, - None, - 784, - None, - 785, - None, - 786, - None, - 787, - None, - 788, - None, - 789, - None, - 790, - None, - 791, - None, - 792, - None, - 793, - None, - 794, - None, - 795, - None, - 796, - None, - 797, - None, - 798, - None, - 799, - None, - 800, - None, - 801, - None, - 802, - None, - 803, - None, - 804, - None, - 805, - None, - 806, - None, - 807, - None, - 808, - None, - 809, - None, - 810, - None, - 811, - None, - 812, - None, - 813, - None, - 814, - None, - 815, - None, - 816, - None, - 817, - None, - 818, - None, - 819, - None, - 820, - None, - 821, - None, - 822, - None, - 823, - None, - 824, - None, - 825, - None, - 826, - None, - 827, - None, - 828, - None, - 829, - None, - 830, - None, - 831, - None, - 832, - None, - 833, - None, - 834, - None, - 835, - None, - 836, - None, - 837, - None, - 838, - None, - 839, - None, - 840, - None, - 841, - None, - 842, - None, - 843, - None, - 844, - None, - 845, - None, - 846, - None, - 847, - None, - 848, - None, - 849, - None, - 850, - None, - 851, - None, - 852, - None, - 853, - None, - 854, - None, - 855, - None, - 856, - None, - 857, - None, - 858, - None, - 859, - None, - 860, - None, - 861, - None, - 862, - None, - 863, - None, - 864, - None, - 865, - None, - 866, - None, - 867, - None, - 868, - None, - 869, - None, - 870, - None, - 871, - None, - 872, - None, - 873, - None, - 874, - None, - 875, - None, - 876, - None, - 877, - None, - 878, - None, - 879, - None, - 880, - None, - 881, - None, - 882, - None, - 883, - None, - 884, - None, - 885, - None, - 886, - None, - 887, - None, - 888, - None, - 889, - None, - 890, - None, - 891, - None, - 892, - None, - 893, - None, - 894, - None, - 895, - None, - 896, - None, - 897, - None, - 898, - None, - 899, - None, - 900, - None, - 901, - None, - 902, - None, - 903, - None, - 904, - None, - 905, - None, - 906, - None, - 907, - None, - 908, - None, - 909, - None, - 910, - None, - 911, - None, - 912, - None, - 913, - None, - 914, - None, - 915, - None, - 916, - None, - 917, - None, - 918, - None, - 919, - None, - 920, - None, - 921, - None, - 922, - None, - 923, - None, - 924, - None, - 925, - None, - 926, - None, - 927, - None, - 928, - None, - 929, - None, - 930, - None, - 931, - None, - 932, - None, - 933, - None, - 934, - None, - 935, - None, - 936, - None, - 937, - None, - 938, - None, - 939, - None, - 940, - None, - 941, - None, - 942, - None, - 943, - None, - 944, - None, - 945, - None, - 946, - None, - 947, - None, - 948, - None, - 949, - None, - 950, - None, - 951, - None, - 952, - None, - 953, - None, - 954, - None, - 955, - None, - 956, - None, - 957, - None, - 958, - None, - 959, - None, - 960, - None, - 961, - None, - 962, - None, - 963, - None, - 964, - None, - 965, - None, - 966, - None, - 967, - None, - 968, - None, - 969, - None, - 970, - None, - 971, - None, - 972, - None, - 973, - None, - 974, - None, - 975, - None, - 976, - None, - 977, - None, - 978, - None, - 979, - None, - 980, - None, - 981, - None, - 982, - None, - 983, - None, - 984, - None, - 985, - None, - 986, - None, - 987, - None, - 988, - None, - 989, - None, - 990, - None, - 991, - None, - 992, - None, - 993, - None, - 994, - None, - 995, - None, - 996, - None, - 997, - None, - 998, - None, - 999, - None, - 1000 -]) +# check([ +# 1, +# None, +# 2, +# None, +# 3, +# None, +# 4, +# None, +# 5, +# None, +# 6, +# None, +# 7, +# None, +# 8, +# None, +# 9, +# None, +# 10, +# None, +# 11, +# None, +# 12, +# None, +# 13, +# None, +# 14, +# None, +# 15, +# None, +# 16, +# None, +# 17, +# None, +# 18, +# None, +# 19, +# None, +# 20, +# None, +# 21, +# None, +# 22, +# None, +# 23, +# None, +# 24, +# None, +# 25, +# None, +# 26, +# None, +# 27, +# None, +# 28, +# None, +# 29, +# None, +# 30, +# None, +# 31, +# None, +# 32, +# None, +# 33, +# None, +# 34, +# None, +# 35, +# None, +# 36, +# None, +# 37, +# None, +# 38, +# None, +# 39, +# None, +# 40, +# None, +# 41, +# None, +# 42, +# None, +# 43, +# None, +# 44, +# None, +# 45, +# None, +# 46, +# None, +# 47, +# None, +# 48, +# None, +# 49, +# None, +# 50, +# None, +# 51, +# None, +# 52, +# None, +# 53, +# None, +# 54, +# None, +# 55, +# None, +# 56, +# None, +# 57, +# None, +# 58, +# None, +# 59, +# None, +# 60, +# None, +# 61, +# None, +# 62, +# None, +# 63, +# None, +# 64, +# None, +# 65, +# None, +# 66, +# None, +# 67, +# None, +# 68, +# None, +# 69, +# None, +# 70, +# None, +# 71, +# None, +# 72, +# None, +# 73, +# None, +# 74, +# None, +# 75, +# None, +# 76, +# None, +# 77, +# None, +# 78, +# None, +# 79, +# None, +# 80, +# None, +# 81, +# None, +# 82, +# None, +# 83, +# None, +# 84, +# None, +# 85, +# None, +# 86, +# None, +# 87, +# None, +# 88, +# None, +# 89, +# None, +# 90, +# None, +# 91, +# None, +# 92, +# None, +# 93, +# None, +# 94, +# None, +# 95, +# None, +# 96, +# None, +# 97, +# None, +# 98, +# None, +# 99, +# None, +# 100, +# None, +# 101, +# None, +# 102, +# None, +# 103, +# None, +# 104, +# None, +# 105, +# None, +# 106, +# None, +# 107, +# None, +# 108, +# None, +# 109, +# None, +# 110, +# None, +# 111, +# None, +# 112, +# None, +# 113, +# None, +# 114, +# None, +# 115, +# None, +# 116, +# None, +# 117, +# None, +# 118, +# None, +# 119, +# None, +# 120, +# None, +# 121, +# None, +# 122, +# None, +# 123, +# None, +# 124, +# None, +# 125, +# None, +# 126, +# None, +# 127, +# None, +# 128, +# None, +# 129, +# None, +# 130, +# None, +# 131, +# None, +# 132, +# None, +# 133, +# None, +# 134, +# None, +# 135, +# None, +# 136, +# None, +# 137, +# None, +# 138, +# None, +# 139, +# None, +# 140, +# None, +# 141, +# None, +# 142, +# None, +# 143, +# None, +# 144, +# None, +# 145, +# None, +# 146, +# None, +# 147, +# None, +# 148, +# None, +# 149, +# None, +# 150, +# None, +# 151, +# None, +# 152, +# None, +# 153, +# None, +# 154, +# None, +# 155, +# None, +# 156, +# None, +# 157, +# None, +# 158, +# None, +# 159, +# None, +# 160, +# None, +# 161, +# None, +# 162, +# None, +# 163, +# None, +# 164, +# None, +# 165, +# None, +# 166, +# None, +# 167, +# None, +# 168, +# None, +# 169, +# None, +# 170, +# None, +# 171, +# None, +# 172, +# None, +# 173, +# None, +# 174, +# None, +# 175, +# None, +# 176, +# None, +# 177, +# None, +# 178, +# None, +# 179, +# None, +# 180, +# None, +# 181, +# None, +# 182, +# None, +# 183, +# None, +# 184, +# None, +# 185, +# None, +# 186, +# None, +# 187, +# None, +# 188, +# None, +# 189, +# None, +# 190, +# None, +# 191, +# None, +# 192, +# None, +# 193, +# None, +# 194, +# None, +# 195, +# None, +# 196, +# None, +# 197, +# None, +# 198, +# None, +# 199, +# None, +# 200, +# None, +# 201, +# None, +# 202, +# None, +# 203, +# None, +# 204, +# None, +# 205, +# None, +# 206, +# None, +# 207, +# None, +# 208, +# None, +# 209, +# None, +# 210, +# None, +# 211, +# None, +# 212, +# None, +# 213, +# None, +# 214, +# None, +# 215, +# None, +# 216, +# None, +# 217, +# None, +# 218, +# None, +# 219, +# None, +# 220, +# None, +# 221, +# None, +# 222, +# None, +# 223, +# None, +# 224, +# None, +# 225, +# None, +# 226, +# None, +# 227, +# None, +# 228, +# None, +# 229, +# None, +# 230, +# None, +# 231, +# None, +# 232, +# None, +# 233, +# None, +# 234, +# None, +# 235, +# None, +# 236, +# None, +# 237, +# None, +# 238, +# None, +# 239, +# None, +# 240, +# None, +# 241, +# None, +# 242, +# None, +# 243, +# None, +# 244, +# None, +# 245, +# None, +# 246, +# None, +# 247, +# None, +# 248, +# None, +# 249, +# None, +# 250, +# None, +# 251, +# None, +# 252, +# None, +# 253, +# None, +# 254, +# None, +# 255, +# None, +# 256, +# None, +# 257, +# None, +# 258, +# None, +# 259, +# None, +# 260, +# None, +# 261, +# None, +# 262, +# None, +# 263, +# None, +# 264, +# None, +# 265, +# None, +# 266, +# None, +# 267, +# None, +# 268, +# None, +# 269, +# None, +# 270, +# None, +# 271, +# None, +# 272, +# None, +# 273, +# None, +# 274, +# None, +# 275, +# None, +# 276, +# None, +# 277, +# None, +# 278, +# None, +# 279, +# None, +# 280, +# None, +# 281, +# None, +# 282, +# None, +# 283, +# None, +# 284, +# None, +# 285, +# None, +# 286, +# None, +# 287, +# None, +# 288, +# None, +# 289, +# None, +# 290, +# None, +# 291, +# None, +# 292, +# None, +# 293, +# None, +# 294, +# None, +# 295, +# None, +# 296, +# None, +# 297, +# None, +# 298, +# None, +# 299, +# None, +# 300, +# None, +# 301, +# None, +# 302, +# None, +# 303, +# None, +# 304, +# None, +# 305, +# None, +# 306, +# None, +# 307, +# None, +# 308, +# None, +# 309, +# None, +# 310, +# None, +# 311, +# None, +# 312, +# None, +# 313, +# None, +# 314, +# None, +# 315, +# None, +# 316, +# None, +# 317, +# None, +# 318, +# None, +# 319, +# None, +# 320, +# None, +# 321, +# None, +# 322, +# None, +# 323, +# None, +# 324, +# None, +# 325, +# None, +# 326, +# None, +# 327, +# None, +# 328, +# None, +# 329, +# None, +# 330, +# None, +# 331, +# None, +# 332, +# None, +# 333, +# None, +# 334, +# None, +# 335, +# None, +# 336, +# None, +# 337, +# None, +# 338, +# None, +# 339, +# None, +# 340, +# None, +# 341, +# None, +# 342, +# None, +# 343, +# None, +# 344, +# None, +# 345, +# None, +# 346, +# None, +# 347, +# None, +# 348, +# None, +# 349, +# None, +# 350, +# None, +# 351, +# None, +# 352, +# None, +# 353, +# None, +# 354, +# None, +# 355, +# None, +# 356, +# None, +# 357, +# None, +# 358, +# None, +# 359, +# None, +# 360, +# None, +# 361, +# None, +# 362, +# None, +# 363, +# None, +# 364, +# None, +# 365, +# None, +# 366, +# None, +# 367, +# None, +# 368, +# None, +# 369, +# None, +# 370, +# None, +# 371, +# None, +# 372, +# None, +# 373, +# None, +# 374, +# None, +# 375, +# None, +# 376, +# None, +# 377, +# None, +# 378, +# None, +# 379, +# None, +# 380, +# None, +# 381, +# None, +# 382, +# None, +# 383, +# None, +# 384, +# None, +# 385, +# None, +# 386, +# None, +# 387, +# None, +# 388, +# None, +# 389, +# None, +# 390, +# None, +# 391, +# None, +# 392, +# None, +# 393, +# None, +# 394, +# None, +# 395, +# None, +# 396, +# None, +# 397, +# None, +# 398, +# None, +# 399, +# None, +# 400, +# None, +# 401, +# None, +# 402, +# None, +# 403, +# None, +# 404, +# None, +# 405, +# None, +# 406, +# None, +# 407, +# None, +# 408, +# None, +# 409, +# None, +# 410, +# None, +# 411, +# None, +# 412, +# None, +# 413, +# None, +# 414, +# None, +# 415, +# None, +# 416, +# None, +# 417, +# None, +# 418, +# None, +# 419, +# None, +# 420, +# None, +# 421, +# None, +# 422, +# None, +# 423, +# None, +# 424, +# None, +# 425, +# None, +# 426, +# None, +# 427, +# None, +# 428, +# None, +# 429, +# None, +# 430, +# None, +# 431, +# None, +# 432, +# None, +# 433, +# None, +# 434, +# None, +# 435, +# None, +# 436, +# None, +# 437, +# None, +# 438, +# None, +# 439, +# None, +# 440, +# None, +# 441, +# None, +# 442, +# None, +# 443, +# None, +# 444, +# None, +# 445, +# None, +# 446, +# None, +# 447, +# None, +# 448, +# None, +# 449, +# None, +# 450, +# None, +# 451, +# None, +# 452, +# None, +# 453, +# None, +# 454, +# None, +# 455, +# None, +# 456, +# None, +# 457, +# None, +# 458, +# None, +# 459, +# None, +# 460, +# None, +# 461, +# None, +# 462, +# None, +# 463, +# None, +# 464, +# None, +# 465, +# None, +# 466, +# None, +# 467, +# None, +# 468, +# None, +# 469, +# None, +# 470, +# None, +# 471, +# None, +# 472, +# None, +# 473, +# None, +# 474, +# None, +# 475, +# None, +# 476, +# None, +# 477, +# None, +# 478, +# None, +# 479, +# None, +# 480, +# None, +# 481, +# None, +# 482, +# None, +# 483, +# None, +# 484, +# None, +# 485, +# None, +# 486, +# None, +# 487, +# None, +# 488, +# None, +# 489, +# None, +# 490, +# None, +# 491, +# None, +# 492, +# None, +# 493, +# None, +# 494, +# None, +# 495, +# None, +# 496, +# None, +# 497, +# None, +# 498, +# None, +# 499, +# None, +# 500, +# None, +# 501, +# None, +# 502, +# None, +# 503, +# None, +# 504, +# None, +# 505, +# None, +# 506, +# None, +# 507, +# None, +# 508, +# None, +# 509, +# None, +# 510, +# None, +# 511, +# None, +# 512, +# None, +# 513, +# None, +# 514, +# None, +# 515, +# None, +# 516, +# None, +# 517, +# None, +# 518, +# None, +# 519, +# None, +# 520, +# None, +# 521, +# None, +# 522, +# None, +# 523, +# None, +# 524, +# None, +# 525, +# None, +# 526, +# None, +# 527, +# None, +# 528, +# None, +# 529, +# None, +# 530, +# None, +# 531, +# None, +# 532, +# None, +# 533, +# None, +# 534, +# None, +# 535, +# None, +# 536, +# None, +# 537, +# None, +# 538, +# None, +# 539, +# None, +# 540, +# None, +# 541, +# None, +# 542, +# None, +# 543, +# None, +# 544, +# None, +# 545, +# None, +# 546, +# None, +# 547, +# None, +# 548, +# None, +# 549, +# None, +# 550, +# None, +# 551, +# None, +# 552, +# None, +# 553, +# None, +# 554, +# None, +# 555, +# None, +# 556, +# None, +# 557, +# None, +# 558, +# None, +# 559, +# None, +# 560, +# None, +# 561, +# None, +# 562, +# None, +# 563, +# None, +# 564, +# None, +# 565, +# None, +# 566, +# None, +# 567, +# None, +# 568, +# None, +# 569, +# None, +# 570, +# None, +# 571, +# None, +# 572, +# None, +# 573, +# None, +# 574, +# None, +# 575, +# None, +# 576, +# None, +# 577, +# None, +# 578, +# None, +# 579, +# None, +# 580, +# None, +# 581, +# None, +# 582, +# None, +# 583, +# None, +# 584, +# None, +# 585, +# None, +# 586, +# None, +# 587, +# None, +# 588, +# None, +# 589, +# None, +# 590, +# None, +# 591, +# None, +# 592, +# None, +# 593, +# None, +# 594, +# None, +# 595, +# None, +# 596, +# None, +# 597, +# None, +# 598, +# None, +# 599, +# None, +# 600, +# None, +# 601, +# None, +# 602, +# None, +# 603, +# None, +# 604, +# None, +# 605, +# None, +# 606, +# None, +# 607, +# None, +# 608, +# None, +# 609, +# None, +# 610, +# None, +# 611, +# None, +# 612, +# None, +# 613, +# None, +# 614, +# None, +# 615, +# None, +# 616, +# None, +# 617, +# None, +# 618, +# None, +# 619, +# None, +# 620, +# None, +# 621, +# None, +# 622, +# None, +# 623, +# None, +# 624, +# None, +# 625, +# None, +# 626, +# None, +# 627, +# None, +# 628, +# None, +# 629, +# None, +# 630, +# None, +# 631, +# None, +# 632, +# None, +# 633, +# None, +# 634, +# None, +# 635, +# None, +# 636, +# None, +# 637, +# None, +# 638, +# None, +# 639, +# None, +# 640, +# None, +# 641, +# None, +# 642, +# None, +# 643, +# None, +# 644, +# None, +# 645, +# None, +# 646, +# None, +# 647, +# None, +# 648, +# None, +# 649, +# None, +# 650, +# None, +# 651, +# None, +# 652, +# None, +# 653, +# None, +# 654, +# None, +# 655, +# None, +# 656, +# None, +# 657, +# None, +# 658, +# None, +# 659, +# None, +# 660, +# None, +# 661, +# None, +# 662, +# None, +# 663, +# None, +# 664, +# None, +# 665, +# None, +# 666, +# None, +# 667, +# None, +# 668, +# None, +# 669, +# None, +# 670, +# None, +# 671, +# None, +# 672, +# None, +# 673, +# None, +# 674, +# None, +# 675, +# None, +# 676, +# None, +# 677, +# None, +# 678, +# None, +# 679, +# None, +# 680, +# None, +# 681, +# None, +# 682, +# None, +# 683, +# None, +# 684, +# None, +# 685, +# None, +# 686, +# None, +# 687, +# None, +# 688, +# None, +# 689, +# None, +# 690, +# None, +# 691, +# None, +# 692, +# None, +# 693, +# None, +# 694, +# None, +# 695, +# None, +# 696, +# None, +# 697, +# None, +# 698, +# None, +# 699, +# None, +# 700, +# None, +# 701, +# None, +# 702, +# None, +# 703, +# None, +# 704, +# None, +# 705, +# None, +# 706, +# None, +# 707, +# None, +# 708, +# None, +# 709, +# None, +# 710, +# None, +# 711, +# None, +# 712, +# None, +# 713, +# None, +# 714, +# None, +# 715, +# None, +# 716, +# None, +# 717, +# None, +# 718, +# None, +# 719, +# None, +# 720, +# None, +# 721, +# None, +# 722, +# None, +# 723, +# None, +# 724, +# None, +# 725, +# None, +# 726, +# None, +# 727, +# None, +# 728, +# None, +# 729, +# None, +# 730, +# None, +# 731, +# None, +# 732, +# None, +# 733, +# None, +# 734, +# None, +# 735, +# None, +# 736, +# None, +# 737, +# None, +# 738, +# None, +# 739, +# None, +# 740, +# None, +# 741, +# None, +# 742, +# None, +# 743, +# None, +# 744, +# None, +# 745, +# None, +# 746, +# None, +# 747, +# None, +# 748, +# None, +# 749, +# None, +# 750, +# None, +# 751, +# None, +# 752, +# None, +# 753, +# None, +# 754, +# None, +# 755, +# None, +# 756, +# None, +# 757, +# None, +# 758, +# None, +# 759, +# None, +# 760, +# None, +# 761, +# None, +# 762, +# None, +# 763, +# None, +# 764, +# None, +# 765, +# None, +# 766, +# None, +# 767, +# None, +# 768, +# None, +# 769, +# None, +# 770, +# None, +# 771, +# None, +# 772, +# None, +# 773, +# None, +# 774, +# None, +# 775, +# None, +# 776, +# None, +# 777, +# None, +# 778, +# None, +# 779, +# None, +# 780, +# None, +# 781, +# None, +# 782, +# None, +# 783, +# None, +# 784, +# None, +# 785, +# None, +# 786, +# None, +# 787, +# None, +# 788, +# None, +# 789, +# None, +# 790, +# None, +# 791, +# None, +# 792, +# None, +# 793, +# None, +# 794, +# None, +# 795, +# None, +# 796, +# None, +# 797, +# None, +# 798, +# None, +# 799, +# None, +# 800, +# None, +# 801, +# None, +# 802, +# None, +# 803, +# None, +# 804, +# None, +# 805, +# None, +# 806, +# None, +# 807, +# None, +# 808, +# None, +# 809, +# None, +# 810, +# None, +# 811, +# None, +# 812, +# None, +# 813, +# None, +# 814, +# None, +# 815, +# None, +# 816, +# None, +# 817, +# None, +# 818, +# None, +# 819, +# None, +# 820, +# None, +# 821, +# None, +# 822, +# None, +# 823, +# None, +# 824, +# None, +# 825, +# None, +# 826, +# None, +# 827, +# None, +# 828, +# None, +# 829, +# None, +# 830, +# None, +# 831, +# None, +# 832, +# None, +# 833, +# None, +# 834, +# None, +# 835, +# None, +# 836, +# None, +# 837, +# None, +# 838, +# None, +# 839, +# None, +# 840, +# None, +# 841, +# None, +# 842, +# None, +# 843, +# None, +# 844, +# None, +# 845, +# None, +# 846, +# None, +# 847, +# None, +# 848, +# None, +# 849, +# None, +# 850, +# None, +# 851, +# None, +# 852, +# None, +# 853, +# None, +# 854, +# None, +# 855, +# None, +# 856, +# None, +# 857, +# None, +# 858, +# None, +# 859, +# None, +# 860, +# None, +# 861, +# None, +# 862, +# None, +# 863, +# None, +# 864, +# None, +# 865, +# None, +# 866, +# None, +# 867, +# None, +# 868, +# None, +# 869, +# None, +# 870, +# None, +# 871, +# None, +# 872, +# None, +# 873, +# None, +# 874, +# None, +# 875, +# None, +# 876, +# None, +# 877, +# None, +# 878, +# None, +# 879, +# None, +# 880, +# None, +# 881, +# None, +# 882, +# None, +# 883, +# None, +# 884, +# None, +# 885, +# None, +# 886, +# None, +# 887, +# None, +# 888, +# None, +# 889, +# None, +# 890, +# None, +# 891, +# None, +# 892, +# None, +# 893, +# None, +# 894, +# None, +# 895, +# None, +# 896, +# None, +# 897, +# None, +# 898, +# None, +# 899, +# None, +# 900, +# None, +# 901, +# None, +# 902, +# None, +# 903, +# None, +# 904, +# None, +# 905, +# None, +# 906, +# None, +# 907, +# None, +# 908, +# None, +# 909, +# None, +# 910, +# None, +# 911, +# None, +# 912, +# None, +# 913, +# None, +# 914, +# None, +# 915, +# None, +# 916, +# None, +# 917, +# None, +# 918, +# None, +# 919, +# None, +# 920, +# None, +# 921, +# None, +# 922, +# None, +# 923, +# None, +# 924, +# None, +# 925, +# None, +# 926, +# None, +# 927, +# None, +# 928, +# None, +# 929, +# None, +# 930, +# None, +# 931, +# None, +# 932, +# None, +# 933, +# None, +# 934, +# None, +# 935, +# None, +# 936, +# None, +# 937, +# None, +# 938, +# None, +# 939, +# None, +# 940, +# None, +# 941, +# None, +# 942, +# None, +# 943, +# None, +# 944, +# None, +# 945, +# None, +# 946, +# None, +# 947, +# None, +# 948, +# None, +# 949, +# None, +# 950, +# None, +# 951, +# None, +# 952, +# None, +# 953, +# None, +# 954, +# None, +# 955, +# None, +# 956, +# None, +# 957, +# None, +# 958, +# None, +# 959, +# None, +# 960, +# None, +# 961, +# None, +# 962, +# None, +# 963, +# None, +# 964, +# None, +# 965, +# None, +# 966, +# None, +# 967, +# None, +# 968, +# None, +# 969, +# None, +# 970, +# None, +# 971, +# None, +# 972, +# None, +# 973, +# None, +# 974, +# None, +# 975, +# None, +# 976, +# None, +# 977, +# None, +# 978, +# None, +# 979, +# None, +# 980, +# None, +# 981, +# None, +# 982, +# None, +# 983, +# None, +# 984, +# None, +# 985, +# None, +# 986, +# None, +# 987, +# None, +# 988, +# None, +# 989, +# None, +# 990, +# None, +# 991, +# None, +# 992, +# None, +# 993, +# None, +# 994, +# None, +# 995, +# None, +# 996, +# None, +# 997, +# None, +# 998, +# None, +# 999, +# None, +# 1000 +# ]) From 9c2212de4722df71e12d77b71f2733d038c92cba Mon Sep 17 00:00:00 2001 From: yujingwen Date: Thu, 13 Jun 2019 06:13:40 +0800 Subject: [PATCH 42/75] =?UTF-8?q?297=20=E4=BC=98=E5=8C=96=E9=80=9F?= =?UTF-8?q?=E5=BA=A6=20144ms=20=E6=89=93=E8=B4=A593%?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_02/id_3/tree/LeetCode_297_3_v1.py | 56 ++++++++++++++++---------- 1 file changed, 35 insertions(+), 21 deletions(-) diff --git a/Week_02/id_3/tree/LeetCode_297_3_v1.py b/Week_02/id_3/tree/LeetCode_297_3_v1.py index 958ff2f5..648089dd 100644 --- a/Week_02/id_3/tree/LeetCode_297_3_v1.py +++ b/Week_02/id_3/tree/LeetCode_297_3_v1.py @@ -12,16 +12,19 @@ def serialize(self, root): queue = [root] none_count = 0 while len(queue) != 0: - node = queue.pop() - if not node: - none_count += 1 - data.append(None) - continue - - none_count = 0 - data.append(node.val) - queue.insert(0, node.left) - queue.insert(0, node.right) + _queue = [] + for i in range(len(queue)): + node = queue[i] + if not node: + none_count += 1 + data.append(None) + continue + + none_count = 0 + data.append(node.val) + _queue.append(node.left) + _queue.append(node.right) + queue = _queue return data[:-none_count] def deserialize(self, data): @@ -31,16 +34,27 @@ def deserialize(self, data): root = TreeNode(data[0]) queue = [root] length = len(data) - for i in range(1, length, 2): - node = queue.pop() - if data[i] is not None: - node.left = TreeNode(data[i]) - queue.insert(0, node.left) - - if i + 1 == length: - break - if data[i + 1] is not None: - node.right = TreeNode(data[i + 1]) - queue.insert(0, node.right) + + index = 1 + while len(queue) != 0: + _queue = [] + for i in range(len(queue)): + node = queue[i] + # 不可思议的问题 + if not node: + continue + if index >= length: + return root + d = data[index] + node.left = TreeNode(d) if d is not None else None + _queue.append(node.left) + index += 1 + if index >= length: + return root + d = data[index] + node.right = TreeNode(d) if d is not None else None + _queue.append(node.right) + index += 1 + queue = _queue return root From 15c734a23227824cc1f2f176dc7fdc7bb1456328 Mon Sep 17 00:00:00 2001 From: yujingwen Date: Thu, 13 Jun 2019 06:16:48 +0800 Subject: [PATCH 43/75] =?UTF-8?q?297=20=E5=BE=AE=E8=B0=83=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E9=80=9F=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_02/id_3/tree/LeetCode_297_3_v1.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Week_02/id_3/tree/LeetCode_297_3_v1.py b/Week_02/id_3/tree/LeetCode_297_3_v1.py index 648089dd..c026cd4d 100644 --- a/Week_02/id_3/tree/LeetCode_297_3_v1.py +++ b/Week_02/id_3/tree/LeetCode_297_3_v1.py @@ -12,6 +12,8 @@ def serialize(self, root): queue = [root] none_count = 0 while len(queue) != 0: + if none_count >= len(queue): + break _queue = [] for i in range(len(queue)): node = queue[i] From 099cfd1b7ebabd09e2fea19a400847ee2bba2179 Mon Sep 17 00:00:00 2001 From: yujingwen Date: Thu, 13 Jun 2019 21:53:14 +0800 Subject: [PATCH 44/75] =?UTF-8?q?315=20=E4=BA=8C=E5=88=86=E6=9F=A5?= =?UTF-8?q?=E6=89=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_02/id_3/NOTE.md | 2 + Week_02/id_3/bstree/315/LeetCode_315_3_v1.py | 40 ++++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 Week_02/id_3/bstree/315/LeetCode_315_3_v1.py diff --git a/Week_02/id_3/NOTE.md b/Week_02/id_3/NOTE.md index 5a9596e6..cb8ec391 100644 --- a/Week_02/id_3/NOTE.md +++ b/Week_02/id_3/NOTE.md @@ -1,2 +1,4 @@ # 学习笔记 Iterator + +读题很重要 二叉树的序列化的教训 diff --git a/Week_02/id_3/bstree/315/LeetCode_315_3_v1.py b/Week_02/id_3/bstree/315/LeetCode_315_3_v1.py new file mode 100644 index 00000000..47480ea5 --- /dev/null +++ b/Week_02/id_3/bstree/315/LeetCode_315_3_v1.py @@ -0,0 +1,40 @@ +""" + 0 建立排序数组 + 1 倒序遍历 + 2 二分查找找到坐标 +""" + + +class Solution: + def countSmaller(self, nums): + _sorted = [] + length = len(nums) + for i in range(length - 1, -1, -1): + v = nums[i] + nums[i] = self.bs(_sorted, v) + + return nums + + def bs(self, nums, v): + if not nums: + nums.append(v) + return 0 + + low = 0 + length = len(nums) + high = length - 1 + while low <= high: + mid = low + int((high-low)/2) + if nums[mid] >= v: + high = mid - 1 + else: + low = mid + 1 + + index = high + 1 + nums.insert(index, v) + return index + + +s = Solution() +print(s.countSmaller([5, 2, 6, 1]) == [2, 1, 1, 0]) +print(s.countSmaller([-1, -1]) == [0, 0]) From 8332dfe0d67691308d4266b27a64587a40dc04ec Mon Sep 17 00:00:00 2001 From: yujingwen Date: Fri, 14 Jun 2019 03:55:10 +0800 Subject: [PATCH 45/75] =?UTF-8?q?692=20=E6=88=91=E5=86=99=E7=9A=84?= =?UTF-8?q?=E8=BF=99=E4=B9=88=E7=83=82=E5=B1=85=E7=84=B6=E9=80=9A=E8=BF=87?= =?UTF-8?q?=E4=BA=86=E2=80=A6=E2=80=A6=E8=BF=98=E6=89=93=E8=B4=A5=E4=BA=86?= =?UTF-8?q?=2098%=2097%?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../id_3/recursion/104/LeetCode_104_3_v2.py | 0 Week_02/id_3/NOTE.md | 3 ++ Week_02/id_3/hash/692/LeetCode_692_3_v1.py | 33 +++++++++++++++++++ 3 files changed, 36 insertions(+) create mode 100644 Week_01/id_3/recursion/104/LeetCode_104_3_v2.py create mode 100644 Week_02/id_3/hash/692/LeetCode_692_3_v1.py 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..e69de29b diff --git a/Week_02/id_3/NOTE.md b/Week_02/id_3/NOTE.md index cb8ec391..dbe49a16 100644 --- a/Week_02/id_3/NOTE.md +++ b/Week_02/id_3/NOTE.md @@ -2,3 +2,6 @@ Iterator 读题很重要 二叉树的序列化的教训 + +import heapq 堆 + diff --git a/Week_02/id_3/hash/692/LeetCode_692_3_v1.py b/Week_02/id_3/hash/692/LeetCode_692_3_v1.py new file mode 100644 index 00000000..869c2f89 --- /dev/null +++ b/Week_02/id_3/hash/692/LeetCode_692_3_v1.py @@ -0,0 +1,33 @@ +class Solution: + def topKFrequent(self, words, k): + word_map = {} + count_list = [] + for w in words: + word_map[w] = word_map.get(w, 0) + 1 + + count_map = {} + for (w, count) in word_map.items(): + count_list.append(count) + wl = count_map.get(count, []) + wl.append(w) + count_map[count] = wl + + count_list.sort(reverse=True) + r = [] + last_count = 0 + for count in count_list: + if last_count == count: + continue + else: + last_count = count + count_map[count].sort() + for w in count_map[count]: + r.append(w) + if len(r) == k: + return r + + +s = Solution() +# print(s.topKFrequent(["i", "love", "leetcode", "i", "love", "coding"], 2)) +# print(s.topKFrequent(["the", "day", "is", "sunny", "the", "the", "the", "sunny", "is", "is"], 4)) +print(s.topKFrequent(["i", "love", "leetcode", "i", "love", "coding"], 3)) From 452b546e77fa64533e3133d7e9bec77bef600697 Mon Sep 17 00:00:00 2001 From: yujingwen Date: Fri, 14 Jun 2019 20:59:11 +0800 Subject: [PATCH 46/75] =?UTF-8?q?3=20O(2n)=20=E8=BF=99=E4=B8=AA=E9=A2=98?= =?UTF-8?q?=E8=B2=8C=E4=BC=BC=E6=9C=89=E7=82=B9=E5=84=BF=E7=AE=80=E5=8D=95?= =?UTF-8?q?=EF=BC=8C=E6=90=9E=E7=9A=84=E6=88=91=E9=83=BD=E6=9C=89=E7=82=B9?= =?UTF-8?q?=E5=84=BF=E8=86=A8=E8=83=80=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_02/id_3/hash/3/LeetCode_3_3_v1.py | 29 ++++++++++++++++++++++ Week_02/id_3/hash/692/LeetCode_692_3_v1.py | 7 ++++++ 2 files changed, 36 insertions(+) create mode 100644 Week_02/id_3/hash/3/LeetCode_3_3_v1.py diff --git a/Week_02/id_3/hash/3/LeetCode_3_3_v1.py b/Week_02/id_3/hash/3/LeetCode_3_3_v1.py new file mode 100644 index 00000000..e337faba --- /dev/null +++ b/Week_02/id_3/hash/3/LeetCode_3_3_v1.py @@ -0,0 +1,29 @@ +class Solution: + def lengthOfLongestSubstring(self, s: str) -> int: + if not s or len(s) == 0: + return 0 + low = high = 0 + length = len(s) + result = 1 + cache_set = set() + while high < length: + v = s[high] + if v not in cache_set: + cache_set.add(v) + high += 1 + result = max(result, high - low) + else: + while low < high: + low_v = s[low] + cache_set.remove(low_v) + low += 1 + if low_v == v: + break + + return result + + +s = Solution() +print(s.lengthOfLongestSubstring("abcabcbb") == 3) +print(s.lengthOfLongestSubstring("bbbbb") == 1) +print(s.lengthOfLongestSubstring("pwwkew") == 3) diff --git a/Week_02/id_3/hash/692/LeetCode_692_3_v1.py b/Week_02/id_3/hash/692/LeetCode_692_3_v1.py index 869c2f89..64babe7e 100644 --- a/Week_02/id_3/hash/692/LeetCode_692_3_v1.py +++ b/Week_02/id_3/hash/692/LeetCode_692_3_v1.py @@ -1,3 +1,10 @@ +""" + 使用数组排序,居然就过了 + 代码有些丑陋,主要是对python不熟悉,不知道怎么自定义排序规则 + 理论上使用最小堆做优化效果更好 +""" + + class Solution: def topKFrequent(self, words, k): word_map = {} From b6c7dce1587aaa46f209cf0a6a04ff01950e73bf Mon Sep 17 00:00:00 2001 From: yujingwen Date: Fri, 14 Jun 2019 21:14:19 +0800 Subject: [PATCH 47/75] =?UTF-8?q?10=20=E4=B8=8D=E8=A1=8C=EF=BC=8C=E6=88=91?= =?UTF-8?q?=E7=9C=9F=E7=9A=84=E8=86=A8=E8=83=80=E4=BA=86=E3=80=82bfs?= =?UTF-8?q?=E7=9A=84=E9=A2=98=E8=BF=9E=E6=B5=8B=E8=AF=95=E9=83=BD=E6=87=92?= =?UTF-8?q?=E7=9A=84=E5=86=99=E4=BA=86=E2=80=A6=E2=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_02/id_3/tree/LeetCode_10_3_v1.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 Week_02/id_3/tree/LeetCode_10_3_v1.py diff --git a/Week_02/id_3/tree/LeetCode_10_3_v1.py b/Week_02/id_3/tree/LeetCode_10_3_v1.py new file mode 100644 index 00000000..16ac45c9 --- /dev/null +++ b/Week_02/id_3/tree/LeetCode_10_3_v1.py @@ -0,0 +1,20 @@ +class Solution: + def levelOrder(self, root): + r = [] + if not root: + return r + queue = [root] + while queue: + _queue = [] + for i in range(len(queue)): + node = queue[i] + queue[i] = node.val + if node.left: + _queue.append(node.left) + if node.right: + _queue.append(node.right) + + r.append(queue) + queue = _queue + + return r From 75448af2b3af6f7304f47e9b392db80794612544 Mon Sep 17 00:00:00 2001 From: yujingwen Date: Fri, 14 Jun 2019 22:25:55 +0800 Subject: [PATCH 48/75] =?UTF-8?q?103=20=E6=88=91=E7=9C=9F=E7=9A=84?= =?UTF-8?q?=E8=86=A8=E8=83=80=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_02/id_3/tree/LeetCode_103_3_v1.py | 22 +++++++++++++++++ Week_02/id_3/tree/LeetCode_103_3_v2.py | 33 ++++++++++++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 Week_02/id_3/tree/LeetCode_103_3_v1.py create mode 100644 Week_02/id_3/tree/LeetCode_103_3_v2.py diff --git a/Week_02/id_3/tree/LeetCode_103_3_v1.py b/Week_02/id_3/tree/LeetCode_103_3_v1.py new file mode 100644 index 00000000..26f74423 --- /dev/null +++ b/Week_02/id_3/tree/LeetCode_103_3_v1.py @@ -0,0 +1,22 @@ +class Solution: + def zigzagLevelOrder(self, root): + r = [] + if not root: + return r + queue = [root] + while queue: + _queue = [] + for i in range(len(queue)): + node = queue[i] + queue[i] = node.val + if node.left: + _queue.append(node.left) + if node.right: + _queue.append(node.right) + + r.append(queue) + if len(r) % 2 == 0: + queue.reverse() + queue = _queue + + return r diff --git a/Week_02/id_3/tree/LeetCode_103_3_v2.py b/Week_02/id_3/tree/LeetCode_103_3_v2.py new file mode 100644 index 00000000..ef9eedfb --- /dev/null +++ b/Week_02/id_3/tree/LeetCode_103_3_v2.py @@ -0,0 +1,33 @@ +class Solution: + def zigzagLevelOrder(self, root): + r = [] + if not root: + return r + queue = [root] + while queue: + r.append(queue) + need_reverse = len(r) % 2 == 0 + _queue = [] + + if need_reverse: + rg = range(len(queue) - 1, -1, -1) + else: + rg = range(len(queue)) + + for i in rg: + node = queue[i] + queue[i] = node.val + if need_reverse: + if node.left: + _queue.append(node.left) + if node.right: + _queue.append(node.right) + else: + if node.left: + _queue.insert(0, node.left) + if node.right: + _queue.insert(0, node.right) + + queue = _queue + + return r From 9fbe027f8f120c19dda34268ffbcabb57fa3c67d Mon Sep 17 00:00:00 2001 From: yujingwen Date: Fri, 14 Jun 2019 23:02:00 +0800 Subject: [PATCH 49/75] =?UTF-8?q?101=20=E5=97=AF=EF=BC=8C=E6=8D=A2?= =?UTF-8?q?=E4=BA=86=E4=B8=AA=E9=9D=9E=E9=80=92=E5=BD=92=E7=9A=84=E6=89=93?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_02/id_3/tree/LeetCode_101_3_v1.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 Week_02/id_3/tree/LeetCode_101_3_v1.py diff --git a/Week_02/id_3/tree/LeetCode_101_3_v1.py b/Week_02/id_3/tree/LeetCode_101_3_v1.py new file mode 100644 index 00000000..87c02651 --- /dev/null +++ b/Week_02/id_3/tree/LeetCode_101_3_v1.py @@ -0,0 +1,21 @@ +class Solution: + def isSymmetric(self, root): + if not root: + return True + stack = [root.left, root.right] + while stack: + n1 = stack.pop() + n2 = stack.pop() + + if not n1 and not n2: + continue + if not n1 or not 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 From f1a1ac036898f8ea1cd60a3677be7bfcd5d0acd2 Mon Sep 17 00:00:00 2001 From: yujingwen Date: Sat, 15 Jun 2019 03:50:33 +0800 Subject: [PATCH 50/75] =?UTF-8?q?98=20=E4=BD=BF=E7=94=A8=E4=B8=AD=E5=BA=8F?= =?UTF-8?q?=E9=81=8D=E5=8E=86=20=E5=92=8C=E4=B8=80=E4=B8=AA=E4=B8=91?= =?UTF-8?q?=E9=99=8B=E7=9A=84=E9=80=92=E5=BD=92=E5=AD=90=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E7=9A=84=E6=96=B9=E5=BC=8F=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_02/id_3/NOTE.md | 4 +++ Week_02/id_3/bstree/98/LeetCode_98_3_v1.py | 21 ++++++++++++++ Week_02/id_3/bstree/98/LeetCode_98_3_v2.py | 32 ++++++++++++++++++++++ 3 files changed, 57 insertions(+) create mode 100644 Week_02/id_3/bstree/98/LeetCode_98_3_v1.py create mode 100644 Week_02/id_3/bstree/98/LeetCode_98_3_v2.py diff --git a/Week_02/id_3/NOTE.md b/Week_02/id_3/NOTE.md index dbe49a16..14b8b09d 100644 --- a/Week_02/id_3/NOTE.md +++ b/Week_02/id_3/NOTE.md @@ -5,3 +5,7 @@ Iterator import heapq 堆 + +问题: +bst + 最大值 是否等价于堆 +python 的链表/堆等数据结构是否缺失 diff --git a/Week_02/id_3/bstree/98/LeetCode_98_3_v1.py b/Week_02/id_3/bstree/98/LeetCode_98_3_v1.py new file mode 100644 index 00000000..98c50800 --- /dev/null +++ b/Week_02/id_3/bstree/98/LeetCode_98_3_v1.py @@ -0,0 +1,21 @@ +class Solution: + def isValidBST(self, root): + """ + 深度优先中序遍历方案 + """ + stack = [] + node = root + last = None + while stack or node: + if node: + stack.append(node) + node = node.left + else: + node = stack.pop() + if last is None or last < node.val: + last = node.val + else: + return False + node = node.right + + return True diff --git a/Week_02/id_3/bstree/98/LeetCode_98_3_v2.py b/Week_02/id_3/bstree/98/LeetCode_98_3_v2.py new file mode 100644 index 00000000..004d48ea --- /dev/null +++ b/Week_02/id_3/bstree/98/LeetCode_98_3_v2.py @@ -0,0 +1,32 @@ +class Solution: + def isValidBST(self, root): + """ + 递归 + """ + if not root: + return True + + return self.min_max(root)[0] + + def min_max(self, node): + if not node.left and not node.right: + return [True, node.val, node.val] + + result = [True, None, None] + if node.left: + r = self.min_max(node.left) + if not r[0] or r[2] >= node.val: + return [False] + result[1] = r[1] + else: + result[1] = node.val + + if node.right: + r = self.min_max(node.right) + if not r[0] or r[1] <= node.val: + return [False] + result[2] = r[2] + else: + result[2] = node.val + + return result From 75651e5ff079e427e616a07bf2dedb130a72119c Mon Sep 17 00:00:00 2001 From: yujingwen Date: Sat, 15 Jun 2019 04:06:48 +0800 Subject: [PATCH 51/75] =?UTF-8?q?=E5=8A=A0=E5=85=A5=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E4=BC=98=E9=9B=85=E7=9A=84=E9=80=92=E5=BD=92=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=20=E5=AD=A6=E4=B9=A0=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_02/id_3/NOTE.md | 4 ++++ Week_02/id_3/bstree/98/LeetCode_98_3_v3.py | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 Week_02/id_3/bstree/98/LeetCode_98_3_v3.py diff --git a/Week_02/id_3/NOTE.md b/Week_02/id_3/NOTE.md index 14b8b09d..7f2ed715 100644 --- a/Week_02/id_3/NOTE.md +++ b/Week_02/id_3/NOTE.md @@ -5,7 +5,11 @@ Iterator import heapq 堆 +技巧 python中处理数字的时候小心使用 if v 或者 if not v 这种写法 +有时候想判断None,结果在0上栽了跟头 问题: bst + 最大值 是否等价于堆 python 的链表/堆等数据结构是否缺失 + +bs中很多实现使用系统最大值最小值,是否有隐患 diff --git a/Week_02/id_3/bstree/98/LeetCode_98_3_v3.py b/Week_02/id_3/bstree/98/LeetCode_98_3_v3.py new file mode 100644 index 00000000..8dc31a1c --- /dev/null +++ b/Week_02/id_3/bstree/98/LeetCode_98_3_v3.py @@ -0,0 +1,19 @@ +class Solution: + def isValidBST(self, root): + """ + bst定义 + 左子树都比节点小 + 右子树都比节点大 + 并且所有子树都一样 + """ + return self.valid(root, None, None) + + def valid(self, node, left, right): + if not node: + return True + if left is not None and left >= node.val: + return False + if right is not None and right <= node.val: + return False + + return self.valid(node.left, left, node.val) and self.valid(node.right, node.val, right) From e30b45d7ddc04ddc77f5e16c9f5bf64314d2446b Mon Sep 17 00:00:00 2001 From: yujingwen Date: Sun, 16 Jun 2019 01:32:28 +0800 Subject: [PATCH 52/75] 938 --- Week_02/id_3/bstree/938/LeetCode_938_3_v1.py | 15 +++++++++++++++ Week_02/id_3/bstree/98/LeetCode_98_3_v3.py | 1 + 2 files changed, 16 insertions(+) create mode 100644 Week_02/id_3/bstree/938/LeetCode_938_3_v1.py diff --git a/Week_02/id_3/bstree/938/LeetCode_938_3_v1.py b/Week_02/id_3/bstree/938/LeetCode_938_3_v1.py new file mode 100644 index 00000000..656c7b91 --- /dev/null +++ b/Week_02/id_3/bstree/938/LeetCode_938_3_v1.py @@ -0,0 +1,15 @@ +class Solution: + def rangeSumBST(self, root, l, r): + return self.dfs(root, l, r) + + def dfs(self, node, l, r): + if not node: + return 0 + + if node.val < l: + return self.dfs(node.right, l, r) + + if node.val > r: + return self.dfs(node.left, l, r) + + return self.dfs(node.left, l, r) + node.val + self.dfs(node.right, l, r) diff --git a/Week_02/id_3/bstree/98/LeetCode_98_3_v3.py b/Week_02/id_3/bstree/98/LeetCode_98_3_v3.py index 8dc31a1c..7ad22d93 100644 --- a/Week_02/id_3/bstree/98/LeetCode_98_3_v3.py +++ b/Week_02/id_3/bstree/98/LeetCode_98_3_v3.py @@ -5,6 +5,7 @@ def isValidBST(self, root): 左子树都比节点小 右子树都比节点大 并且所有子树都一样 + 写起来代码更好看,更优雅 """ return self.valid(root, None, None) From 57bd84263796b9533d7c9d555322f16d39b82c98 Mon Sep 17 00:00:00 2001 From: yujingwen Date: Sun, 16 Jun 2019 04:24:25 +0800 Subject: [PATCH 53/75] =?UTF-8?q?220=20=E5=88=9D=E6=AD=A5=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=20=E9=9D=9E=E5=B8=B8=E7=B9=81=E7=90=90=20=E6=9C=89?= =?UTF-8?q?=E5=BE=85=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_02/id_3/bstree/220/LeetCode_220_v1.py | 81 ++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 Week_02/id_3/bstree/220/LeetCode_220_v1.py diff --git a/Week_02/id_3/bstree/220/LeetCode_220_v1.py b/Week_02/id_3/bstree/220/LeetCode_220_v1.py new file mode 100644 index 00000000..b9c33da6 --- /dev/null +++ b/Week_02/id_3/bstree/220/LeetCode_220_v1.py @@ -0,0 +1,81 @@ +""" +暴力解法时间复杂度 O(kn) 似乎实现没什么难度,但是想必无法通过测试 +目前的思路是 维护一个空间为k的bst做为窗口 只要bst中距离目标值最近的元素绝对值小于等于t 即可返回True +在迭代数组的时候,对bst进行增与删的维护 +由于python似乎没有bst的数据结构,所以使用一个排序数组替代实现 +""" + + +class Solution: + def containsNearbyAlmostDuplicate(self, nums, k, t): + if not nums: + return False + if k == 0: + return False + if t < 0: + return False + + length = len(nums) + + if k > length: + k = length + + if length == 1: + return False + + sort_list = [nums[0]] + for i in range(1, length): + v = nums[i] + p = self.position(sort_list, v) + if sort_list[p] == v: + return True + + # 这里想写的优雅还挺难 边界处理起来很复杂 + if t >= abs(sort_list[p]-v): + return True + if sort_list[p] > v: + if p >= 0 and t >= abs(sort_list[p - 1]-v): + return True + else: + if (p+1) < len(sort_list) and t >= abs(sort_list[p + 1]-v): + return True + + if i < k: + self.insert(sort_list, p, v) + continue + + need_pop = nums[i-k] + if need_pop == v: + continue + else: + self.insert(sort_list, p, v) + sort_list.pop(self.position(sort_list, need_pop)) + return False + + def insert(self, sort_list, p, v): + if sort_list[p] > v: + sort_list.insert(p, v) + else: + sort_list.insert(p + 1, v) + + def position(self, sort_list, v): + low = 0 + high = len(sort_list) - 1 + while low <= high: + mid = low + int((high - low)/2) + if sort_list[mid] == v: + return mid + if sort_list[mid] > v: + high = mid - 1 + else: + low = mid + 1 + + return mid + + +s = Solution() + +print(s.containsNearbyAlmostDuplicate([1, 2, 3, 1], 3, 0)) +print(s.containsNearbyAlmostDuplicate([1, 0, 1, 1], 1, 2)) +print(s.containsNearbyAlmostDuplicate([1, 5, 9, 1, 5, 9], 2, 3)) +print(s.containsNearbyAlmostDuplicate([4, 1, 6, 3], 100, 1)) From 28c14d5389a05a5bbcec18c88b5c6297ba1e7e0e Mon Sep 17 00:00:00 2001 From: yujingwen Date: Sun, 16 Jun 2019 05:04:50 +0800 Subject: [PATCH 54/75] =?UTF-8?q?=E6=B1=97=EF=BC=8C=E6=9A=B4=E5=8A=9B?= =?UTF-8?q?=E7=9A=84=E6=95=88=E7=8E=87=E8=BF=98=E6=8C=BA=E9=AB=98=E7=9A=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_02/id_3/bstree/220/LeetCode_220_v1.py | 2 +- Week_02/id_3/bstree/220/LeetCode_220_v2.py | 48 ++++++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 Week_02/id_3/bstree/220/LeetCode_220_v2.py diff --git a/Week_02/id_3/bstree/220/LeetCode_220_v1.py b/Week_02/id_3/bstree/220/LeetCode_220_v1.py index b9c33da6..b42c0b0e 100644 --- a/Week_02/id_3/bstree/220/LeetCode_220_v1.py +++ b/Week_02/id_3/bstree/220/LeetCode_220_v1.py @@ -18,7 +18,7 @@ def containsNearbyAlmostDuplicate(self, nums, k, t): length = len(nums) if k > length: - k = length + k = length - 1 if length == 1: return False diff --git a/Week_02/id_3/bstree/220/LeetCode_220_v2.py b/Week_02/id_3/bstree/220/LeetCode_220_v2.py new file mode 100644 index 00000000..ea4c3680 --- /dev/null +++ b/Week_02/id_3/bstree/220/LeetCode_220_v2.py @@ -0,0 +1,48 @@ +""" +暴力解法时间复杂度 O(kn) 似乎实现没什么难度,但是想必无法通过测试 +但是上一个解法python实现效率太差了,试试暴力行不行 +""" + + +class Solution: + def containsNearbyAlmostDuplicate(self, nums, k, t): + if k > t: + return self.tn(nums, k, t) + else: + return self.kn(nums, k, t) + + def tn(self, nums, k, t): + m = {} + for i in range(len(nums)): + v = nums[i] + for j in range(-t, t + 1): + if (v+j) in m and k >= (i - m[v+j]): + return True + m[v] = i + return False + + def kn(self, nums, k, t): + length = len(nums) + if k > length: + k = length - 1 + for i in range(length): + v = nums[i] + for p in range(1, k + 1): + index = i + p + if index == length: + break + if t >= abs(v - nums[index]): + return True + + return False + + +s = Solution() + +print(s.containsNearbyAlmostDuplicate([1, 2, 3, 1], 3, 0)) +print(s.containsNearbyAlmostDuplicate([1, 0, 1, 1], 1, 2)) +print(s.containsNearbyAlmostDuplicate([1, 5, 9, 1, 5, 9], 2, 3)) +print(s.containsNearbyAlmostDuplicate([4, 1, 6, 3], 100, 1)) +print(s.containsNearbyAlmostDuplicate([7, 1, 3], 2, 3)) +print(s.containsNearbyAlmostDuplicate([7, 2, 8], 2, 1)) +print(s.containsNearbyAlmostDuplicate([2, 0, -2, 2], 2, 1)) From ad495111a19eec5802faf189750ef73c21922ef5 Mon Sep 17 00:00:00 2001 From: yujingwen Date: Sun, 16 Jun 2019 05:51:51 +0800 Subject: [PATCH 55/75] =?UTF-8?q?220=20=E5=A2=9E=E5=8A=A0=E6=9A=B4?= =?UTF-8?q?=E5=8A=9B=E7=A0=B4=E8=A7=A3=E5=92=8C=E9=AB=98=E4=BA=BA=E8=AE=A9?= =?UTF-8?q?=E4=BA=BA=E9=9C=87=E6=83=8A=E7=9A=84=E8=A7=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_02/id_3/NOTE.md | 2 + ...eetCode_220_v1.py => LeetCode_220_3_v1.py} | 0 ...eetCode_220_v2.py => LeetCode_220_3_v2.py} | 8 +++ Week_02/id_3/bstree/220/LeetCode_220_3_v3.py | 60 +++++++++++++++++++ 4 files changed, 70 insertions(+) rename Week_02/id_3/bstree/220/{LeetCode_220_v1.py => LeetCode_220_3_v1.py} (100%) rename Week_02/id_3/bstree/220/{LeetCode_220_v2.py => LeetCode_220_3_v2.py} (90%) create mode 100644 Week_02/id_3/bstree/220/LeetCode_220_3_v3.py diff --git a/Week_02/id_3/NOTE.md b/Week_02/id_3/NOTE.md index 7f2ed715..305abff1 100644 --- a/Week_02/id_3/NOTE.md +++ b/Week_02/id_3/NOTE.md @@ -13,3 +13,5 @@ bst + 最大值 是否等价于堆 python 的链表/堆等数据结构是否缺失 bs中很多实现使用系统最大值最小值,是否有隐患 + +python 整除 // diff --git a/Week_02/id_3/bstree/220/LeetCode_220_v1.py b/Week_02/id_3/bstree/220/LeetCode_220_3_v1.py similarity index 100% rename from Week_02/id_3/bstree/220/LeetCode_220_v1.py rename to Week_02/id_3/bstree/220/LeetCode_220_3_v1.py diff --git a/Week_02/id_3/bstree/220/LeetCode_220_v2.py b/Week_02/id_3/bstree/220/LeetCode_220_3_v2.py similarity index 90% rename from Week_02/id_3/bstree/220/LeetCode_220_v2.py rename to Week_02/id_3/bstree/220/LeetCode_220_3_v2.py index ea4c3680..5a5f8855 100644 --- a/Week_02/id_3/bstree/220/LeetCode_220_v2.py +++ b/Week_02/id_3/bstree/220/LeetCode_220_3_v2.py @@ -1,11 +1,19 @@ """ 暴力解法时间复杂度 O(kn) 似乎实现没什么难度,但是想必无法通过测试 但是上一个解法python实现效率太差了,试试暴力行不行 +没想到还真通过了 """ class Solution: def containsNearbyAlmostDuplicate(self, nums, k, t): + if not nums: + return False + if k == 0: + return False + if t < 0: + return False + if k > t: return self.tn(nums, k, t) else: diff --git a/Week_02/id_3/bstree/220/LeetCode_220_3_v3.py b/Week_02/id_3/bstree/220/LeetCode_220_3_v3.py new file mode 100644 index 00000000..fb88f25b --- /dev/null +++ b/Week_02/id_3/bstree/220/LeetCode_220_3_v3.py @@ -0,0 +1,60 @@ +""" +参考高人的写法 震惊 + +如果abs(n1, n2) <= t +那么 abs(n1//t - n2//t) <= 1 + +数字 n 只需要在缓存中查找 n//t-1, n//t, n//t+1 (以下记为 m1, m2, m3) 三个对应的数据即可找到是否有符合条件的数据存在。 +n如果存在满足条件的目标答案,必然会首先出现在 m1, m2, m3所对应的数据中。 +nums中可能存在多个数据与m123映射,其中可能存在符合条件与不符合条件的数据, +但当迭代到n时,m123必然不会出现曾经有效的数据被无效数据覆盖的情况。 +例如m3对应n3_1与n3_2两个值,其中abs(n3_1-n)<=t, abs(n3_2-n)>t,如果存在这种情况,当数据遍历至n3_2时即可返回True,不会迭代至n。 +缓存维护k个数据即可满足下标不超过k的条件。 + +整体时间复杂度O(n) 神了 跪下了 +""" + + +class Solution: + def containsNearbyAlmostDuplicate(self, nums, k, t): + if not nums: + return False + if k == 0: + return False + if t < 0: + return False + + m = {} + length = len(nums) + if k > length: + k = length - 1 + + for i in range(length): + v = nums[i] + + key = v if not t else v//t + + for j in (-1, 0, 1): + x = m.get(key + j, None) + if x is None: + continue + if t >= abs(x - v): + return True + + if i >= k: + m.pop(nums[i-k] if not t else nums[i-k]//t) + + m[key] = v + + return False + + +s = Solution() + +print(s.containsNearbyAlmostDuplicate([1, 2, 3, 1], 3, 0)) +print(s.containsNearbyAlmostDuplicate([1, 0, 1, 1], 1, 2)) +print(s.containsNearbyAlmostDuplicate([1, 5, 9, 1, 5, 9], 2, 3)) +print(s.containsNearbyAlmostDuplicate([4, 1, 6, 3], 100, 1)) +print(s.containsNearbyAlmostDuplicate([7, 1, 3], 2, 3)) +print(s.containsNearbyAlmostDuplicate([7, 2, 8], 2, 1)) +print(s.containsNearbyAlmostDuplicate([2, 0, -2, 2], 2, 1)) From e88ad04c1d8fa818d36b255f4387e999dab992bc Mon Sep 17 00:00:00 2001 From: yujingwen Date: Mon, 17 Jun 2019 14:42:40 +0800 Subject: [PATCH 56/75] =?UTF-8?q?=E4=BC=98=E5=8C=96315?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_02/id_3/NOTE.md | 4 ++++ Week_02/id_3/bstree/315/LeetCode_315_3_v1.py | 18 ++++++------------ 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/Week_02/id_3/NOTE.md b/Week_02/id_3/NOTE.md index 305abff1..b22dea54 100644 --- a/Week_02/id_3/NOTE.md +++ b/Week_02/id_3/NOTE.md @@ -15,3 +15,7 @@ python 的链表/堆等数据结构是否缺失 bs中很多实现使用系统最大值最小值,是否有隐患 python 整除 // + +实现数据结构,借助面向对象的成员变量,是一个好办法吗? + +python 的整除写法似乎比 int()来处理更快 diff --git a/Week_02/id_3/bstree/315/LeetCode_315_3_v1.py b/Week_02/id_3/bstree/315/LeetCode_315_3_v1.py index 47480ea5..3d6c0c84 100644 --- a/Week_02/id_3/bstree/315/LeetCode_315_3_v1.py +++ b/Week_02/id_3/bstree/315/LeetCode_315_3_v1.py @@ -15,24 +15,18 @@ def countSmaller(self, nums): return nums - def bs(self, nums, v): - if not nums: - nums.append(v) - return 0 - + def bs(self, _sorted, v): low = 0 - length = len(nums) - high = length - 1 + high = len(_sorted) - 1 while low <= high: - mid = low + int((high-low)/2) - if nums[mid] >= v: + mid = low + (high-low)//2 + if _sorted[mid] >= v: high = mid - 1 else: low = mid + 1 - index = high + 1 - nums.insert(index, v) - return index + _sorted.insert(low, v) + return low s = Solution() From 91c04d4efcbccae7bf443500da0e0e10ad72a0f7 Mon Sep 17 00:00:00 2001 From: yujingwen Date: Mon, 17 Jun 2019 20:04:17 +0800 Subject: [PATCH 57/75] 242 --- Week_02/id_3/hash/242/LeetCode_242_3_v1.py | 23 ++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 Week_02/id_3/hash/242/LeetCode_242_3_v1.py diff --git a/Week_02/id_3/hash/242/LeetCode_242_3_v1.py b/Week_02/id_3/hash/242/LeetCode_242_3_v1.py new file mode 100644 index 00000000..01c623fc --- /dev/null +++ b/Week_02/id_3/hash/242/LeetCode_242_3_v1.py @@ -0,0 +1,23 @@ +c_a = ord('a') + + +class Solution: + def isAnagram(self, s: str, t: str) -> bool: + if len(s) != len(t): + return False + arr = [0] * 26 + for c in s: + arr[ord(c) % c_a] += 1 + + for c in t: + i = ord(c) % c_a + if arr[i] == 0: + return False + arr[i] -= 1 + + return True + + +s = Solution() +print(s.isAnagram("anagram", "nagaram")) +print(s.isAnagram("rat", "car")) From 5dd42a29ca6e3afa9393df48f2c25426f6647f22 Mon Sep 17 00:00:00 2001 From: yujingwen Date: Mon, 17 Jun 2019 20:13:26 +0800 Subject: [PATCH 58/75] 1 resolve --- Week_02/id_3/hash/1/LeetCode_1_3_v1.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 Week_02/id_3/hash/1/LeetCode_1_3_v1.py diff --git a/Week_02/id_3/hash/1/LeetCode_1_3_v1.py b/Week_02/id_3/hash/1/LeetCode_1_3_v1.py new file mode 100644 index 00000000..ed2e04c3 --- /dev/null +++ b/Week_02/id_3/hash/1/LeetCode_1_3_v1.py @@ -0,0 +1,16 @@ +class Solution: + def twoSum(self, nums, target): + cache = {} + for i in range(len(nums)): + n = nums[i] + v = target - n + if v in cache: + return [cache.get(v), i] + else: + cache[n] = i + + return [] + + +s = Solution() +print(s.twoSum([2, 7, 11, 15], 9)) From 2287d8d9ac08d66b4e87fffb4d60a21e65ae3356 Mon Sep 17 00:00:00 2001 From: yujingwen Date: Tue, 18 Jun 2019 02:06:08 +0800 Subject: [PATCH 59/75] =?UTF-8?q?111=20=E5=B9=BF=E5=BA=A6=20+=20=E6=B7=B1?= =?UTF-8?q?=E5=BA=A6=E5=89=AA=E6=9E=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_02/id_3/tree/LeetCode_111_3_v1.py | 21 +++++++++++++++++++++ Week_02/id_3/tree/LeetCode_111_3_v2.py | 21 +++++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 Week_02/id_3/tree/LeetCode_111_3_v1.py create mode 100644 Week_02/id_3/tree/LeetCode_111_3_v2.py diff --git a/Week_02/id_3/tree/LeetCode_111_3_v1.py b/Week_02/id_3/tree/LeetCode_111_3_v1.py new file mode 100644 index 00000000..dadc6d29 --- /dev/null +++ b/Week_02/id_3/tree/LeetCode_111_3_v1.py @@ -0,0 +1,21 @@ +class Solution: + def minDepth(self, root) -> int: + if root is None: + return 0 + + queue = [root] + + level = 0 + while queue: + level += 1 + _queue = [] + for node in queue: + if not node.left and not node.right: + return level + + if node.left: + _queue.append(node.left) + if node.right: + _queue.append(node.right) + + queue = _queue diff --git a/Week_02/id_3/tree/LeetCode_111_3_v2.py b/Week_02/id_3/tree/LeetCode_111_3_v2.py new file mode 100644 index 00000000..f61c3539 --- /dev/null +++ b/Week_02/id_3/tree/LeetCode_111_3_v2.py @@ -0,0 +1,21 @@ +class Solution: + def minDepth(self, root) -> int: + if root is None: + return 0 + + self.level = None + self.dfs(root, 0) + return self.level + + def dfs(self, node, level): + if not node: + return + level += 1 + if self.level and self.level <= level: + return + if not node.left and not node.right: + self.level = level + return + + self.dfs(node.left, level) + self.dfs(node.right, level) From 1a3415b82f37fc6dc55540741caea4c6bb3c2d24 Mon Sep 17 00:00:00 2001 From: yujingwen Date: Tue, 18 Jun 2019 14:25:27 +0800 Subject: [PATCH 60/75] 235 --- Week_02/id_3/bstree/235/LeetCode_235_3_v1.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 Week_02/id_3/bstree/235/LeetCode_235_3_v1.py diff --git a/Week_02/id_3/bstree/235/LeetCode_235_3_v1.py b/Week_02/id_3/bstree/235/LeetCode_235_3_v1.py new file mode 100644 index 00000000..17cb938b --- /dev/null +++ b/Week_02/id_3/bstree/235/LeetCode_235_3_v1.py @@ -0,0 +1,14 @@ +class Solution: + def lowestCommonAncestor(self, root, p, q): + if p.val > q.val: + p, q = q, p + while True: + if root.val < p.val: + root = root.right + continue + + if root.val > q.val: + root = root.left + continue + + return root From 3260b7e869806ab5b0fc9530c73c48b34d463821 Mon Sep 17 00:00:00 2001 From: yujingwen Date: Tue, 18 Jun 2019 21:33:29 +0800 Subject: [PATCH 61/75] =?UTF-8?q?738=20=E9=9D=9E=E9=80=92=E5=BD=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../id_3/recursion/104/LeetCode_104_3_v2.py | 2 ++ Week_01/id_3/recursion/104/test_104.py | 7 ++++-- .../id_3/recursion/783/LeetCode_783_3_v1.py | 24 +++++++++++++++++++ 3 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 Week_01/id_3/recursion/783/LeetCode_783_3_v1.py 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 index e69de29b..7aac2393 100644 --- a/Week_01/id_3/recursion/104/LeetCode_104_3_v2.py +++ 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 index 95b17ced..ad8861fd 100644 --- a/Week_01/id_3/recursion/104/test_104.py +++ b/Week_01/id_3/recursion/104/test_104.py @@ -21,9 +21,11 @@ def build_node(nums, i): return node -import lc_104_v1 +import LeetCode_104_3_v1 +import LeetCode_104_3_v2 -f = lc_104_v1.max_depth +# f = LeetCode_104_3_v1.max_depth +f = LeetCode_104_3_v2.max_depth def check(nums, r): @@ -32,3 +34,4 @@ def check(nums, 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/783/LeetCode_783_3_v1.py b/Week_01/id_3/recursion/783/LeetCode_783_3_v1.py new file mode 100644 index 00000000..4f0c06fe --- /dev/null +++ b/Week_01/id_3/recursion/783/LeetCode_783_3_v1.py @@ -0,0 +1,24 @@ +class Solution: + def minDiffInBST(self, root) -> int: + if not root: + return 0 + stack = [] + node = root + diff = None + last = None + while stack or node: + if node: + stack.append(node) + node = node.left + else: + node = stack.pop() + if last: + if diff: + diff = min(diff, node.val - last) + else: + diff = node.val - last + + last = node.val + node = node.right + + return diff From a1c79f5f921da821e72bcebd787211b1c6dd5515 Mon Sep 17 00:00:00 2001 From: yujingwen Date: Tue, 18 Jun 2019 21:37:20 +0800 Subject: [PATCH 62/75] =?UTF-8?q?783=20=E4=BC=98=E5=8C=96=E9=9D=9E?= =?UTF-8?q?=E9=80=92=E5=BD=92=E4=B8=AD=E5=BA=8F=E9=81=8D=E5=8E=86=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_01/id_3/recursion/783/LeetCode_783_3_v1.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) 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 index 4f0c06fe..40805343 100644 --- a/Week_01/id_3/recursion/783/LeetCode_783_3_v1.py +++ b/Week_01/id_3/recursion/783/LeetCode_783_3_v1.py @@ -4,20 +4,16 @@ def minDiffInBST(self, root) -> int: return 0 stack = [] node = root - diff = None - last = None + # 题目中有说明取值在 2 - 100 + diff = 99 + last = -100 while stack or node: if node: stack.append(node) node = node.left else: node = stack.pop() - if last: - if diff: - diff = min(diff, node.val - last) - else: - diff = node.val - last - + diff = min(diff, node.val - last) last = node.val node = node.right From e705bd04faead22556d90fa7c3405d654fba4156 Mon Sep 17 00:00:00 2001 From: yujingwen Date: Tue, 18 Jun 2019 21:45:39 +0800 Subject: [PATCH 63/75] =?UTF-8?q?783=20=E9=80=92=E5=BD=92=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_01/id_3/recursion/783/LeetCode_783_3_v2.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 Week_01/id_3/recursion/783/LeetCode_783_3_v2.py 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 From 7a25ebc0332b83933f5d541eb3430d13936dba2a Mon Sep 17 00:00:00 2001 From: yujingwen Date: Tue, 18 Jun 2019 22:05:29 +0800 Subject: [PATCH 64/75] =?UTF-8?q?783=20=E5=8A=A0=E5=85=A5=E5=8F=A6?= =?UTF-8?q?=E4=B8=80=E7=A7=8D=E9=9D=9E=E9=80=92=E5=BD=92=E7=9A=84=E4=B8=AD?= =?UTF-8?q?=E5=BA=8F=E9=81=8D=E5=8E=86=E5=86=99=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../id_3/recursion/783/LeetCode_783_3_v3.py | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 Week_01/id_3/recursion/783/LeetCode_783_3_v3.py 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 From 0b56a7b2324a81f15be9fa8921bf4e1f50a5484c Mon Sep 17 00:00:00 2001 From: yujingwen Date: Wed, 19 Jun 2019 04:00:31 +0800 Subject: [PATCH 65/75] 257 --- Week_01/id_3/bs/bs_basis.py | 61 ++++++++++++++++--- .../id_3/recursion/257/LeetCode_257_3_v1.py | 21 +++++++ 2 files changed, 72 insertions(+), 10 deletions(-) create mode 100644 Week_01/id_3/recursion/257/LeetCode_257_3_v1.py diff --git a/Week_01/id_3/bs/bs_basis.py b/Week_01/id_3/bs/bs_basis.py index 39234132..f4982618 100644 --- a/Week_01/id_3/bs/bs_basis.py +++ b/Week_01/id_3/bs/bs_basis.py @@ -37,13 +37,54 @@ def bs_first(nums, x): return -1 -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) +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/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() From 01229f65f4988e720506c1205817e4ddacd288b3 Mon Sep 17 00:00:00 2001 From: yujingwen Date: Thu, 20 Jun 2019 05:01:43 +0800 Subject: [PATCH 66/75] =?UTF-8?q?295=20=E6=9C=80=E5=A4=A7=E6=9C=80?= =?UTF-8?q?=E5=B0=8F=E5=A0=86=E5=AE=9E=E7=8E=B0=E4=B8=AD=E4=BD=8D=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_03/id_3/heap/LeetCode_295_3_v1.py | 50 ++++++++++++++++++++++++++ Week_03/id_3/heap/LeetCode_295_3_v2.py | 21 +++++++++++ Week_03/id_3/heap/LeetCode_703_3.py | 31 ++++++++++++++++ 3 files changed, 102 insertions(+) create mode 100644 Week_03/id_3/heap/LeetCode_295_3_v1.py create mode 100644 Week_03/id_3/heap/LeetCode_295_3_v2.py create mode 100644 Week_03/id_3/heap/LeetCode_703_3.py diff --git a/Week_03/id_3/heap/LeetCode_295_3_v1.py b/Week_03/id_3/heap/LeetCode_295_3_v1.py new file mode 100644 index 00000000..af68d50e --- /dev/null +++ b/Week_03/id_3/heap/LeetCode_295_3_v1.py @@ -0,0 +1,50 @@ +import heapq + + +class MedianFinder: + """ + 用最大最小双堆实现 + """ + + def __init__(self): + self.min_heap = [] + self.max_heap = [] + + def addNum(self, num: int) -> None: + # >= 其实不是最优的写法 但是大差不差 理论上如果存在相等的值,可以判断哪个堆数量少 + # 优雅的写法不是最高效的,但是可以忽略不计 + if not self.min_heap or -num >= self.min_heap[0]: + heapq.heappush(self.min_heap, -num) + else: + heapq.heappush(self.max_heap, num) + if abs(len(self.min_heap) - len(self.max_heap)) == 2: + if len(self.min_heap) > len(self.max_heap): + heapq.heappush(self.max_heap, -heapq.heappop(self.min_heap)) + else: + heapq.heappush(self.min_heap, -heapq.heappop(self.max_heap)) + + def findMedian(self) -> float: + if not self.min_heap and not self.max_heap: + return None + if len(self.min_heap) == len(self.max_heap): + return (-self.min_heap[0] + self.max_heap[0])/2 + if len(self.min_heap) > len(self.max_heap): + return -self.min_heap[0] + else: + return self.max_heap[0] + + +s = MedianFinder() +s.addNum(1) +s.addNum(2) +print(s.findMedian(), s.findMedian() == 1.5) +s.addNum(3) +print(s.findMedian(), s.findMedian() == 2) +s.addNum(0) +print(s.findMedian(), s.findMedian() == 1.5) +s.addNum(9) +print(s.findMedian(), s.findMedian() == 2) +s.addNum(6) +print(s.findMedian(), s.findMedian() == 2.5) +s.addNum(7) +print(s.findMedian(), s.findMedian() == 3) diff --git a/Week_03/id_3/heap/LeetCode_295_3_v2.py b/Week_03/id_3/heap/LeetCode_295_3_v2.py new file mode 100644 index 00000000..928004a4 --- /dev/null +++ b/Week_03/id_3/heap/LeetCode_295_3_v2.py @@ -0,0 +1,21 @@ +class MedianFinder: + """ + 尝试跳表实现 + """ + + def __init__(self): + pass + + def addNum(self, num: int) -> None: + pass + + def findMedian(self) -> float: + pass + + +s = MedianFinder() +s.addNum(1) +s.addNum(2) +print(s.findMedian(), s.findMedian() == 1.5) +s.addNum(3) +print(s.findMedian(), s.findMedian() == 2) diff --git a/Week_03/id_3/heap/LeetCode_703_3.py b/Week_03/id_3/heap/LeetCode_703_3.py new file mode 100644 index 00000000..3879979b --- /dev/null +++ b/Week_03/id_3/heap/LeetCode_703_3.py @@ -0,0 +1,31 @@ +import heapq + + +class KthLargest: + + def __init__(self, k: int, nums): + self.heap = [] + self.k = k + for v in nums: + self.add(v) + + def add(self, val: int): + if len(self.heap) < self.k: + heapq.heappush(self.heap, val) + elif val > self.heap[0]: + heapq.heapreplace(self.heap, val) + + return self.heap[0] + + +kthLargest = KthLargest(3, [4, 5, 8, 2]) +print(kthLargest.add(3) == 4) +print(kthLargest.add(5) == 5) +print(kthLargest.add(10) == 5) +print(kthLargest.add(9) == 8) +print(kthLargest.add(4) == 8) + +h = heapq.nlargest(3, [1, 2, 3, 4, 5]) +heapq.heappush(h, 9) +print(h) + From 29376bcb821cdd5a551103e870cd457b005b365a Mon Sep 17 00:00:00 2001 From: yujingwen Date: Fri, 21 Jun 2019 04:50:30 +0800 Subject: [PATCH 67/75] 210 207 --- Week_03/id_3/graph/LeetCode_200_3.py | 70 +++++++++++++++++++++++++ Week_03/id_3/graph/LeetCode_207_3_v1.py | 43 +++++++++++++++ Week_03/id_3/graph/LeetCode_207_3_v2.py | 44 ++++++++++++++++ Week_03/id_3/graph/LeetCode_210_3.py | 35 +++++++++++++ 4 files changed, 192 insertions(+) create mode 100644 Week_03/id_3/graph/LeetCode_200_3.py create mode 100644 Week_03/id_3/graph/LeetCode_207_3_v1.py create mode 100644 Week_03/id_3/graph/LeetCode_207_3_v2.py create mode 100644 Week_03/id_3/graph/LeetCode_210_3.py diff --git a/Week_03/id_3/graph/LeetCode_200_3.py b/Week_03/id_3/graph/LeetCode_200_3.py new file mode 100644 index 00000000..7f480dd3 --- /dev/null +++ b/Week_03/id_3/graph/LeetCode_200_3.py @@ -0,0 +1,70 @@ +""" +grid为二维数组 +给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量。 +一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。 + +输入: +11110 +11010 +11000 +00000 +输出: 1 + +输入: +11000 +11000 +00100 +00011 +输出: 3 +""" + + +class Solution: + def numIslands(self, grid) -> int: + if not grid: + return 0 + + width = len(grid[0]) + height = len(grid) + + count = 0 + for i in range(height): + arr = grid[i] + for j in range(width): + ceil = arr[j] + if ceil == '1': + count += 1 + self.dfs(grid, i, j, width, height) + return count + + def dfs(self, grid, i, j, width, height): + if i < 0 or i >= height or j < 0 or j >= width: + return + if grid[i][j] == '0': + return + grid[i][j] = '0' + self.dfs(grid, i + 1, j, width, height) + self.dfs(grid, i - 1, j, width, height) + self.dfs(grid, i, j + 1, width, height) + self.dfs(grid, i, j - 1, width, height) + + +s = Solution() + +print(s.numIslands( + [ + ["1", "1", "1", "1", "0"], + ["1", "1", "0", "1", "0"], + ["1", "1", "0", "0", "0"], + ["0", "0", "0", "0", "0"] + ] +)) + +print(s.numIslands( + [ + ["1", "1", "0", "0", "0"], + ["1", "1", "0", "0", "0"], + ["0", "0", "1", "0", "0"], + ["0", "0", "0", "1", "1"] + ] +)) diff --git a/Week_03/id_3/graph/LeetCode_207_3_v1.py b/Week_03/id_3/graph/LeetCode_207_3_v1.py new file mode 100644 index 00000000..0ff6e936 --- /dev/null +++ b/Week_03/id_3/graph/LeetCode_207_3_v1.py @@ -0,0 +1,43 @@ +""" +经典的拓扑排序 +numCourses 课程数 +prerequisites 课程依赖关系 也就是边列表 + +在拓扑排序过程中如果无法完成则说明图中存在环 也就是返回False +例如图中存在 (0,1) (1,2) (2,0) 形成一个环 +则三个节点0,1,2的入度都不小于1,在进行拓扑排序时,三个节点由于环的存在,不会出现有节点降为0的情况。 + +BFS实现 +""" + + +class Solution: + def canFinish(self, numCourses, prerequisites): + queue = [] + node_list = [[] for i in range(numCourses)] + topology_list = [0 for i in range(numCourses)] + + for e in prerequisites: + node_list[e[1]].append(e[0]) + topology_list[e[0]] += 1 + + for i, n in enumerate(topology_list): + if n == 0: + queue.append(i) + + while queue: + node = queue.pop() + for sn in node_list[node]: + topology_list[sn] -= 1 + if topology_list[sn] == 0: + queue.insert(0, sn) + + for count in topology_list: + if count != 0: + return False + return True + + +s = Solution() +print(s.canFinish(2, [[1, 0]])) +print(s.canFinish(2, [[1, 0], [0, 1]])) diff --git a/Week_03/id_3/graph/LeetCode_207_3_v2.py b/Week_03/id_3/graph/LeetCode_207_3_v2.py new file mode 100644 index 00000000..9db4ed41 --- /dev/null +++ b/Week_03/id_3/graph/LeetCode_207_3_v2.py @@ -0,0 +1,44 @@ +""" +经典的拓扑排序 +numCourses 课程数 +prerequisites 课程依赖关系 也就是边列表 + +在拓扑排序过程中如果无法完成则说明图中存在环 也就是返回False +例如图中存在 (0,1) (1,2) (2,0) 形成一个环 +则三个节点0,1,2的入度都不小于1,在进行拓扑排序时,三个节点由于环的存在,不会出现有节点降为0的情况。 + +DFS实现 +""" + + +class Solution: + def canFinish(self, numCourses, prerequisites): + node_list = [[] for i in range(numCourses)] + topology_list = [0 for i in range(numCourses)] + + for e in prerequisites: + node_list[e[1]].append(e[0]) + topology_list[e[0]] += 1 + + for i, n in list(filter(lambda e: not e[1], enumerate(topology_list))): + self.dfs(i, node_list, topology_list) + + for count in topology_list: + if count != 0: + return False + return True + + def dfs(self, node, node_list, topology_list): + for sn in node_list[node]: + print('sn', sn) + topology_list[sn] -= 1 + if topology_list[sn] == 0: + self.dfs(sn, node_list, topology_list) + + +s = Solution() +# print(s.canFinish(2, [[1, 0]])) +# print(s.canFinish(2, [[1, 0], [0, 1]])) +# print(s.canFinish(3, [[0, 1], [0, 2], [1, 2]])) +# print(s.canFinish(3, [[1, 0], [2, 0]])) +print(s.canFinish(3, [[0, 1], [0, 2], [1, 2]])) diff --git a/Week_03/id_3/graph/LeetCode_210_3.py b/Week_03/id_3/graph/LeetCode_210_3.py new file mode 100644 index 00000000..6af7c293 --- /dev/null +++ b/Week_03/id_3/graph/LeetCode_210_3.py @@ -0,0 +1,35 @@ +""" +经典的拓扑排序 +numCourses 课程数 +prerequisites 课程依赖关系 也就是边列表 +BFS +""" + + +class Solution: + def findOrder(self, numCourses, prerequisites): + queue = [] + node_list = [[] for i in range(numCourses)] + topology_list = [0 for i in range(numCourses)] + + for e in prerequisites: + node_list[e[1]].append(e[0]) + topology_list[e[0]] += 1 + + for i, n in enumerate(topology_list): + if n == 0: + queue.append(i) + + results = [] + while queue: + node = queue.pop() + results.append(node) + for sn in node_list[node]: + topology_list[sn] -= 1 + if topology_list[sn] == 0: + queue.insert(0, sn) + continue + + if len(results) != numCourses: + return [] + return results From 1c11ba28c0e76165df7049c980ba14a4e3429a30 Mon Sep 17 00:00:00 2001 From: yujingwen Date: Fri, 21 Jun 2019 17:30:52 +0800 Subject: [PATCH 68/75] =?UTF-8?q?210=20dfs=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_03/id_3/graph/LeetCode_207_3_v1.py | 4 +- Week_03/id_3/graph/LeetCode_207_3_v2.py | 4 +- ...LeetCode_210_3.py => LeetCode_210_3_v1.py} | 5 +-- Week_03/id_3/graph/LeetCode_210_3_v2.py | 38 +++++++++++++++++++ 4 files changed, 44 insertions(+), 7 deletions(-) rename Week_03/id_3/graph/{LeetCode_210_3.py => LeetCode_210_3_v1.py} (84%) create mode 100644 Week_03/id_3/graph/LeetCode_210_3_v2.py diff --git a/Week_03/id_3/graph/LeetCode_207_3_v1.py b/Week_03/id_3/graph/LeetCode_207_3_v1.py index 0ff6e936..1a83c9a7 100644 --- a/Week_03/id_3/graph/LeetCode_207_3_v1.py +++ b/Week_03/id_3/graph/LeetCode_207_3_v1.py @@ -14,8 +14,8 @@ class Solution: def canFinish(self, numCourses, prerequisites): queue = [] - node_list = [[] for i in range(numCourses)] - topology_list = [0 for i in range(numCourses)] + node_list = [[] for _ in range(numCourses)] + topology_list = [0 for _ in range(numCourses)] for e in prerequisites: node_list[e[1]].append(e[0]) diff --git a/Week_03/id_3/graph/LeetCode_207_3_v2.py b/Week_03/id_3/graph/LeetCode_207_3_v2.py index 9db4ed41..73c302ff 100644 --- a/Week_03/id_3/graph/LeetCode_207_3_v2.py +++ b/Week_03/id_3/graph/LeetCode_207_3_v2.py @@ -13,8 +13,8 @@ class Solution: def canFinish(self, numCourses, prerequisites): - node_list = [[] for i in range(numCourses)] - topology_list = [0 for i in range(numCourses)] + node_list = [[] for _ in range(numCourses)] + topology_list = [0 for _ in range(numCourses)] for e in prerequisites: node_list[e[1]].append(e[0]) diff --git a/Week_03/id_3/graph/LeetCode_210_3.py b/Week_03/id_3/graph/LeetCode_210_3_v1.py similarity index 84% rename from Week_03/id_3/graph/LeetCode_210_3.py rename to Week_03/id_3/graph/LeetCode_210_3_v1.py index 6af7c293..2588db30 100644 --- a/Week_03/id_3/graph/LeetCode_210_3.py +++ b/Week_03/id_3/graph/LeetCode_210_3_v1.py @@ -9,8 +9,8 @@ class Solution: def findOrder(self, numCourses, prerequisites): queue = [] - node_list = [[] for i in range(numCourses)] - topology_list = [0 for i in range(numCourses)] + node_list = [[] for _ in range(numCourses)] + topology_list = [0 for _ in range(numCourses)] for e in prerequisites: node_list[e[1]].append(e[0]) @@ -28,7 +28,6 @@ def findOrder(self, numCourses, prerequisites): topology_list[sn] -= 1 if topology_list[sn] == 0: queue.insert(0, sn) - continue if len(results) != numCourses: return [] diff --git a/Week_03/id_3/graph/LeetCode_210_3_v2.py b/Week_03/id_3/graph/LeetCode_210_3_v2.py new file mode 100644 index 00000000..60a0da99 --- /dev/null +++ b/Week_03/id_3/graph/LeetCode_210_3_v2.py @@ -0,0 +1,38 @@ +class Solution: + def findOrder(self, numCourses, prerequisites): + node_list = list([] for _ in range(numCourses)) + topology_list = list(0 for _ in range(numCourses)) + + for t, s in prerequisites: + node_list[s].append(t) + topology_list[t] += 1 + + results = [] + visited = set() + for e in list(filter(lambda e: e[1] == 0, enumerate(topology_list))): + results.append(e[0]) + if not self.dfs(e[0], node_list, topology_list, visited, results): + return [] + + if len(results) != numCourses: + return [] + return results + + def dfs(self, node, node_list, topology_list, visited, results): + if node in visited: + return False + visited.add(node) + for sn in node_list[node]: + topology_list[sn] -= 1 + if topology_list[sn] == 0: + results.append(sn) + if not self.dfs(sn, node_list, topology_list, visited, results): + return False + visited.remove(node) + return True + + +s = Solution() +print(s.findOrder(4, [[2, 0], [1, 0], [3, 1], [3, 2], [1, 3]])) +print(s.findOrder(7, [[1, 0], [0, 3], [0, 2], [3, 2], [2, 5], [4, 5], [5, 6], [2, 4]])) +print(s.findOrder(3, [[1, 0], [1, 2], [0, 1]])) From cfa8c97711cc1eb6de018f6433e2d042f1f18906 Mon Sep 17 00:00:00 2001 From: yujingwen Date: Fri, 21 Jun 2019 20:46:13 +0800 Subject: [PATCH 69/75] =?UTF-8?q?329=20dfs+cache=20=E6=88=91=E5=8F=88?= =?UTF-8?q?=E8=A6=81=E8=86=A8=E8=83=80=E4=BA=86=EF=BC=8Chard=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E4=B8=80=E6=9D=A1=E8=BF=87=E2=80=A6=E2=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_03/id_3/dfs/LeetCode_329_3_v1.py | 52 +++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 Week_03/id_3/dfs/LeetCode_329_3_v1.py diff --git a/Week_03/id_3/dfs/LeetCode_329_3_v1.py b/Week_03/id_3/dfs/LeetCode_329_3_v1.py new file mode 100644 index 00000000..8a9dd33c --- /dev/null +++ b/Week_03/id_3/dfs/LeetCode_329_3_v1.py @@ -0,0 +1,52 @@ +""" +矩阵中的最长递增路径 +思路:DFS + 缓存 +DFS过程由于需求是数值递增,所以在下钻到过程中不会出现回路,不需要缓存去重。 +由于需要找到全局最优解,所以也不需要依赖贪心。 +""" + + +class Solution: + def longestIncreasingPath(self, matrix): + if not matrix: + return 0 + col_length = len(matrix) + row_length = len(matrix[0]) + cache = [ + [0] * row_length for _ in range(col_length) + ] + r = 0 + for i in range(col_length): + for j in range(row_length): + r = max(r, self.dfs(matrix, cache, i, j, col_length, row_length, None)) + + return r + + def dfs(self, matrix, cache, i, j, col_length, row_length, prev): + if i < 0 or i >= col_length or j < 0 or j >= row_length: + return 0 + + curr = matrix[i][j] + if prev is not None and prev >= curr: + return 0 + + if cache[i][j]: + return cache[i][j] + + r = 1 + max( + self.dfs(matrix, cache, i+1, j, col_length, row_length, curr), + self.dfs(matrix, cache, i-1, j, col_length, row_length, curr), + self.dfs(matrix, cache, i, j+1, col_length, row_length, curr), + self.dfs(matrix, cache, i, j-1, col_length, row_length, curr), + ) + cache[i][j] = r + return r + + +s = Solution() +print(s.longestIncreasingPath( +[ + [9, 9, 4], + [6, 6, 8], + [2, 1, 1] +])) From ae535ba827df1f007d835aa63a1e211d24c549c2 Mon Sep 17 00:00:00 2001 From: yujingwen Date: Sat, 22 Jun 2019 03:38:04 +0800 Subject: [PATCH 70/75] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=8B=93=E6=89=91?= =?UTF-8?q?=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_03/id_3/dfs/LeetCode_529_3_v1.py | 0 Week_03/id_3/graph/LeetCode_207_3_v2.py | 4 ++-- Week_03/id_3/graph/LeetCode_210_3_v2.py | 25 ++++++++++++++----------- 3 files changed, 16 insertions(+), 13 deletions(-) create mode 100644 Week_03/id_3/dfs/LeetCode_529_3_v1.py diff --git a/Week_03/id_3/dfs/LeetCode_529_3_v1.py b/Week_03/id_3/dfs/LeetCode_529_3_v1.py new file mode 100644 index 00000000..e69de29b diff --git a/Week_03/id_3/graph/LeetCode_207_3_v2.py b/Week_03/id_3/graph/LeetCode_207_3_v2.py index 73c302ff..5420fea2 100644 --- a/Week_03/id_3/graph/LeetCode_207_3_v2.py +++ b/Week_03/id_3/graph/LeetCode_207_3_v2.py @@ -30,7 +30,6 @@ def canFinish(self, numCourses, prerequisites): def dfs(self, node, node_list, topology_list): for sn in node_list[node]: - print('sn', sn) topology_list[sn] -= 1 if topology_list[sn] == 0: self.dfs(sn, node_list, topology_list) @@ -41,4 +40,5 @@ def dfs(self, node, node_list, topology_list): # print(s.canFinish(2, [[1, 0], [0, 1]])) # print(s.canFinish(3, [[0, 1], [0, 2], [1, 2]])) # print(s.canFinish(3, [[1, 0], [2, 0]])) -print(s.canFinish(3, [[0, 1], [0, 2], [1, 2]])) +# print(s.canFinish(3, [[0, 1], [0, 2], [1, 2]])) +print(s.canFinish(4, [[1, 0], [2, 1], [0, 2], [2, 3]])) diff --git a/Week_03/id_3/graph/LeetCode_210_3_v2.py b/Week_03/id_3/graph/LeetCode_210_3_v2.py index 60a0da99..f4a13554 100644 --- a/Week_03/id_3/graph/LeetCode_210_3_v2.py +++ b/Week_03/id_3/graph/LeetCode_210_3_v2.py @@ -1,3 +1,14 @@ +""" +经典的拓扑排序 +numCourses 课程数 +prerequisites 课程依赖关系 也就是边列表 +DFS + +由于我使用的是从起点向后下钻,当遇到新的入度为0的节点才下钻,所以不会出现死循环的问题。 +如果是从后向前,或者不判断入度数量,可能就需要一个visited的缓存来判断是否在迭代过程中出现了环。 +""" + + class Solution: def findOrder(self, numCourses, prerequisites): node_list = list([] for _ in range(numCourses)) @@ -8,28 +19,20 @@ def findOrder(self, numCourses, prerequisites): topology_list[t] += 1 results = [] - visited = set() for e in list(filter(lambda e: e[1] == 0, enumerate(topology_list))): results.append(e[0]) - if not self.dfs(e[0], node_list, topology_list, visited, results): - return [] + self.dfs(e[0], node_list, topology_list, results) if len(results) != numCourses: return [] return results - def dfs(self, node, node_list, topology_list, visited, results): - if node in visited: - return False - visited.add(node) + def dfs(self, node, node_list, topology_list, results): for sn in node_list[node]: topology_list[sn] -= 1 if topology_list[sn] == 0: results.append(sn) - if not self.dfs(sn, node_list, topology_list, visited, results): - return False - visited.remove(node) - return True + self.dfs(sn, node_list, topology_list, results) s = Solution() From fb89d2ea7779f68afeffe8f72c3a24a3f6a139b5 Mon Sep 17 00:00:00 2001 From: yujingwen Date: Sat, 22 Jun 2019 17:26:03 +0800 Subject: [PATCH 71/75] =?UTF-8?q?529=E5=88=9D=E6=AD=A5=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=20=E4=BD=86=E6=98=AF=E4=BB=A3=E7=A0=81=E6=9C=89=E7=82=B9?= =?UTF-8?q?=E5=84=BF=E7=B9=81=E7=90=90=20=E4=B8=A4=E6=AC=A1=E8=BF=AD?= =?UTF-8?q?=E4=BB=A3=E5=91=A8=E8=BE=B9=E5=85=AB=E4=B8=AA=E8=8A=82=E7=82=B9?= =?UTF-8?q?=EF=BC=8C=E4=B8=8D=E7=9F=A5=E9=81=93=E8=83=BD=E5=90=A6=E7=AE=80?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_03/id_3/dfs/LeetCode_529_3_v1.py | 73 +++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/Week_03/id_3/dfs/LeetCode_529_3_v1.py b/Week_03/id_3/dfs/LeetCode_529_3_v1.py index e69de29b..8d92b51f 100644 --- a/Week_03/id_3/dfs/LeetCode_529_3_v1.py +++ b/Week_03/id_3/dfs/LeetCode_529_3_v1.py @@ -0,0 +1,73 @@ +""" +典型二维数组DFS +退出条件:当前节点是雷或者出界 +下钻条件:当前节点不是雷,且周边没有雷,则下钻周边8个节点 +""" +DIRECT_LIST = [ + (-1, 0), + (-1, 1), + (0, 1), + (1, 1), + (1, 0), + (1, -1), + (0, -1), + (-1, -1), +] + + +class Solution: + def updateBoard(self, board, click): + if not board: + return board + + i, j = click + v = board[i][j] + if v == 'M': + board[i][j] = 'X' + return board + self.dfs(board, i, j) + return board + + def dfs(self, board, i, j): + if i < 0 or j < 0 or i >= len(board) or j >= len(board[0]): + return + v = board[i][j] + if v != 'E': + return + num = self.check_num(board, i, j) + if num: + board[i][j] = str(num) + else: + board[i][j] = 'B' + for _i, _j in DIRECT_LIST: + __i = i + _i + __j = j + _j + self.dfs(board, __i, __j) + + def check_num(self, board, i, j): + num = 0 + for _i, _j in DIRECT_LIST: + __i = i + _i + __j = j + _j + if __i < 0 or __j < 0 or __i >= len(board) or __j >= len(board[0]): + continue + if board[__i][__j] == 'M': + num += 1 + return num + + +def check(board, click, result): + s = Solution() + r = s.updateBoard(board, click) + print(r) + print(r == result) + + +check([['E', 'E', 'E', 'E', 'E'], + ['E', 'E', 'M', 'E', 'E'], + ['E', 'E', 'E', 'E', 'E'], + ['E', 'E', 'E', 'E', 'E']], [3, 0], + [['B', '1', 'E', '1', 'B'], + ['B', '1', 'M', '1', 'B'], + ['B', '1', '1', '1', 'B'], + ['B', 'B', 'B', 'B', 'B']]) From 70af42ff317de8ed892f8ba03e237eb4fe1e3031 Mon Sep 17 00:00:00 2001 From: yujingwen Date: Sat, 22 Jun 2019 17:33:10 +0800 Subject: [PATCH 72/75] =?UTF-8?q?529=20=E7=95=A5=E5=BE=AE=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E4=B8=80=E4=B8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_03/id_3/dfs/LeetCode_529_3_v1.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Week_03/id_3/dfs/LeetCode_529_3_v1.py b/Week_03/id_3/dfs/LeetCode_529_3_v1.py index 8d92b51f..d3ebd1b3 100644 --- a/Week_03/id_3/dfs/LeetCode_529_3_v1.py +++ b/Week_03/id_3/dfs/LeetCode_529_3_v1.py @@ -29,7 +29,7 @@ def updateBoard(self, board, click): return board def dfs(self, board, i, j): - if i < 0 or j < 0 or i >= len(board) or j >= len(board[0]): + if self.check_out_border(board, i, j): return v = board[i][j] if v != 'E': @@ -49,12 +49,15 @@ def check_num(self, board, i, j): for _i, _j in DIRECT_LIST: __i = i + _i __j = j + _j - if __i < 0 or __j < 0 or __i >= len(board) or __j >= len(board[0]): + if self.check_out_border(board, __i, __j): continue if board[__i][__j] == 'M': num += 1 return num + def check_out_border(self, board, i, j): + return i < 0 or j < 0 or i >= len(board) or j >= len(board[0]) + def check(board, click, result): s = Solution() From aaf20ee6c1ba904071c973802366c8421fff8102 Mon Sep 17 00:00:00 2001 From: yujingwen Date: Sat, 22 Jun 2019 22:23:09 +0800 Subject: [PATCH 73/75] =?UTF-8?q?127=20dfs=E6=B2=A1=E5=81=9A=E5=87=BA?= =?UTF-8?q?=E6=9D=A5=EF=BC=8C=E5=A7=8B=E7=BB=88=E8=B6=85=E6=97=B6=E3=80=82?= =?UTF-8?q?bfs=E5=8F=8D=E5=80=92=E6=98=AF=E6=AF=94=E8=BE=83=E5=AE=B9?= =?UTF-8?q?=E6=98=93=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_03/id_3/dfs/LeetCode_127_3_v1.py | 322 ++++++++++++++++++++++++++ Week_03/id_3/dfs/LeetCode_127_3_v2.py | 61 +++++ 2 files changed, 383 insertions(+) create mode 100644 Week_03/id_3/dfs/LeetCode_127_3_v1.py create mode 100644 Week_03/id_3/dfs/LeetCode_127_3_v2.py diff --git a/Week_03/id_3/dfs/LeetCode_127_3_v1.py b/Week_03/id_3/dfs/LeetCode_127_3_v1.py new file mode 100644 index 00000000..5b740a0d --- /dev/null +++ b/Week_03/id_3/dfs/LeetCode_127_3_v1.py @@ -0,0 +1,322 @@ +""" +初步思路就是 回溯暴力 并缓存每个节点的最近值用来剪枝 +例如经过 n1次到达节点w1 cache[w1] = n1 +当再次触达 w1时,当前n2如果>=n1则没有必要进一步下钻了 + +===== 超时了 + +改进思路,之前太过暴力 n^n,这次先用n^2构建邻接表,避免过多重复的判断试试 +时间复杂度就变成了 e^n 如果还是超时 就要进一步剪枝了 + +===== 跑单个用力耗时接近2s 还是继续优化 +由于cache的存在 visited的set没有存在的必要了 因为如果出现环 必然后迭代的level要超过cache之前都值,就会被剪掉 + +===== 后面居然还有个4位 2800个单词的用例 又超时了 +尝试使用两个cache,一个做正向的visited_cache,剪掉触达过慢的节点。另一个做逆向结果缓存cache。 +另外邻接表也不搞了,这个用例光构建邻接表就超时了 + +===== 依然没用过 看这个用例官方的答案是11,2000^11也是不可能的,必须做更多预处理 +利用模糊一个字符的方式快速构建类似邻接表的东西,把原本n^2简化为n +本地运算的时间在可控范围内了,但是服务器提交肯定是不行 + +DFS怕是不行了…… +""" +import sys +sys.setrecursionlimit(10000) + + +class Solution: + def ladderLength(self, begin, end, word_list) -> int: + if not begin or not end or not word_list or end not in word_list: + return 0 + visited_cache = {} + arrived_cache = {} + word_graph = {} + for w in word_list: + for i in range(len(w)): + k = w[0:i] + '*' + w[i+1:] + arr = word_graph.get(k, []) + arr.append(w) + word_graph[k] = arr + return self.dfs(begin, end, 1, word_graph, visited_cache, arrived_cache) + + def dfs(self, curr, end, level, word_graph, visited_cache, arrived_cache): + if curr in arrived_cache: + return arrived_cache[curr] + if curr in visited_cache and level >= visited_cache[curr]: + return 0 + + visited_cache[curr] = level + results = [] + for i in range(len(curr)): + k = curr[0:i] + '*' + curr[i+1:] + if k not in word_graph: + continue + for w in word_graph[k]: + if w == curr: + continue + if w == end: + arrived_cache[curr] = 2 + return 2 + results.append(self.dfs(w, end, level + 1, word_graph, visited_cache, arrived_cache)) + + results = list(filter(lambda r: r != 0, results)) + if not results: + return 0 + return 1 + min(results) + # + # def diff_count(self, ss, ts): + # count = 0 + # for i in range(len(ss)): + # if ss[i] != ts[i]: + # count += 1 + # return count + # + # def check(self, ss, ts): + # if len(ss) != len(ts): + # return False + # return self.diff_count(ss, ts) == 1 + + +s = Solution() +print(s.ladderLength("hit", "cog", ["hot", "dot", "dog", "lot", "log", "cog"])) +print(s.ladderLength("hit", "cog", ["hot", "dot", "dog", "lot"])) +print(s.ladderLength("sand", "acne", + ["slit", "bunk", "wars", "ping", "viva", "wynn", "wows", "irks", "gang", "pool", "mock", "fort", + "heel", "send", "ship", "cols", "alec", "foal", "nabs", "gaze", "giza", "mays", "dogs", "karo", + "cums", "jedi", "webb", "lend", "mire", "jose", "catt", "grow", "toss", "magi", "leis", "bead", + "kara", "hoof", "than", "ires", "baas", "vein", "kari", "riga", "oars", "gags", "thug", "yawn", + "wive", "view", "germ", "flab", "july", "tuck", "rory", "bean", "feed", "rhee", "jeez", "gobs", + "lath", "desk", "yoko", "cute", "zeus", "thus", "dims", "link", "dirt", "mara", "disc", "limy", + "lewd", "maud", "duly", "elsa", "hart", "rays", "rues", "camp", "lack", "okra", "tome", "math", + "plug", "monk", "orly", "friz", "hogs", "yoda", "poop", "tick", "plod", "cloy", "pees", "imps", + "lead", "pope", "mall", "frey", "been", "plea", "poll", "male", "teak", "soho", "glob", "bell", + "mary", "hail", "scan", "yips", "like", "mull", "kory", "odor", "byte", "kaye", "word", "honk", + "asks", "slid", "hopi", "toke", "gore", "flew", "tins", "mown", "oise", "hall", "vega", "sing", + "fool", "boat", "bobs", "lain", "soft", "hard", "rots", "sees", "apex", "chan", "told", "woos", + "unit", "scow", "gilt", "beef", "jars", "tyre", "imus", "neon", "soap", "dabs", "rein", "ovid", + "hose", "husk", "loll", "asia", "cope", "tail", "hazy", "clad", "lash", "sags", "moll", "eddy", + "fuel", "lift", "flog", "land", "sigh", "saks", "sail", "hook", "visa", "tier", "maws", "roeg", + "gila", "eyes", "noah", "hypo", "tore", "eggs", "rove", "chap", "room", "wait", "lurk", "race", + "host", "dada", "lola", "gabs", "sobs", "joel", "keck", "axed", "mead", "gust", "laid", "ends", + "oort", "nose", "peer", "kept", "abet", "iran", "mick", "dead", "hags", "tens", "gown", "sick", + "odis", "miro", "bill", "fawn", "sumo", "kilt", "huge", "ores", "oran", "flag", "tost", "seth", + "sift", "poet", "reds", "pips", "cape", "togo", "wale", "limn", "toll", "ploy", "inns", "snag", + "hoes", "jerk", "flux", "fido", "zane", "arab", "gamy", "raze", "lank", "hurt", "rail", "hind", + "hoot", "dogy", "away", "pest", "hoed", "pose", "lose", "pole", "alva", "dino", "kind", "clan", + "dips", "soup", "veto", "edna", "damp", "gush", "amen", "wits", "pubs", "fuzz", "cash", "pine", + "trod", "gunk", "nude", "lost", "rite", "cory", "walt", "mica", "cart", "avow", "wind", "book", + "leon", "life", "bang", "draw", "leek", "skis", "dram", "ripe", "mine", "urea", "tiff", "over", + "gale", "weir", "defy", "norm", "tull", "whiz", "gill", "ward", "crag", "when", "mill", "firs", + "sans", "flue", "reid", "ekes", "jain", "mutt", "hems", "laps", "piss", "pall", "rowe", "prey", + "cull", "knew", "size", "wets", "hurl", "wont", "suva", "girt", "prys", "prow", "warn", "naps", + "gong", "thru", "livy", "boar", "sade", "amok", "vice", "slat", "emir", "jade", "karl", "loyd", + "cerf", "bess", "loss", "rums", "lats", "bode", "subs", "muss", "maim", "kits", "thin", "york", + "punt", "gays", "alpo", "aids", "drag", "eras", "mats", "pyre", "clot", "step", "oath", "lout", + "wary", "carp", "hums", "tang", "pout", "whip", "fled", "omar", "such", "kano", "jake", "stan", + "loop", "fuss", "mini", "byrd", "exit", "fizz", "lire", "emil", "prop", "noes", "awed", "gift", + "soli", "sale", "gage", "orin", "slur", "limp", "saar", "arks", "mast", "gnat", "port", "into", + "geed", "pave", "awls", "cent", "cunt", "full", "dint", "hank", "mate", "coin", "tars", "scud", + "veer", "coax", "bops", "uris", "loom", "shod", "crib", "lids", "drys", "fish", "edit", "dick", + "erna", "else", "hahs", "alga", "moho", "wire", "fora", "tums", "ruth", "bets", "duns", "mold", + "mush", "swop", "ruby", "bolt", "nave", "kite", "ahem", "brad", "tern", "nips", "whew", "bait", + "ooze", "gino", "yuck", "drum", "shoe", "lobe", "dusk", "cult", "paws", "anew", "dado", "nook", + "half", "lams", "rich", "cato", "java", "kemp", "vain", "fees", "sham", "auks", "gish", "fire", + "elam", "salt", "sour", "loth", "whit", "yogi", "shes", "scam", "yous", "lucy", "inez", "geld", + "whig", "thee", "kelp", "loaf", "harm", "tomb", "ever", "airs", "page", "laud", "stun", "paid", + "goop", "cobs", "judy", "grab", "doha", "crew", "item", "fogs", "tong", "blip", "vest", "bran", + "wend", "bawl", "feel", "jets", "mixt", "tell", "dire", "devi", "milo", "deng", "yews", "weak", + "mark", "doug", "fare", "rigs", "poke", "hies", "sian", "suez", "quip", "kens", "lass", "zips", + "elva", "brat", "cosy", "teri", "hull", "spun", "russ", "pupa", "weed", "pulp", "main", "grim", + "hone", "cord", "barf", "olav", "gaps", "rote", "wilt", "lars", "roll", "balm", "jana", "give", + "eire", "faun", "suck", "kegs", "nita", "weer", "tush", "spry", "loge", "nays", "heir", "dope", + "roar", "peep", "nags", "ates", "bane", "seas", "sign", "fred", "they", "lien", "kiev", "fops", + "said", "lawn", "lind", "miff", "mass", "trig", "sins", "furl", "ruin", "sent", "cray", "maya", + "clog", "puns", "silk", "axis", "grog", "jots", "dyer", "mope", "rand", "vend", "keen", "chou", + "dose", "rain", "eats", "sped", "maui", "evan", "time", "todd", "skit", "lief", "sops", "outs", + "moot", "faze", "biro", "gook", "fill", "oval", "skew", "veil", "born", "slob", "hyde", "twin", + "eloy", "beat", "ergs", "sure", "kobe", "eggo", "hens", "jive", "flax", "mons", "dunk", "yest", + "begs", "dial", "lodz", "burp", "pile", "much", "dock", "rene", "sago", "racy", "have", "yalu", + "glow", "move", "peps", "hods", "kins", "salk", "hand", "cons", "dare", "myra", "sega", "type", + "mari", "pelt", "hula", "gulf", "jugs", "flay", "fest", "spat", "toms", "zeno", "taps", "deny", + "swag", "afro", "baud", "jabs", "smut", "egos", "lara", "toes", "song", "fray", "luis", "brut", + "olen", "mere", "ruff", "slum", "glad", "buds", "silt", "rued", "gelt", "hive", "teem", "ides", + "sink", "ands", "wisp", "omen", "lyre", "yuks", "curb", "loam", "darn", "liar", "pugs", "pane", + "carl", "sang", "scar", "zeds", "claw", "berg", "hits", "mile", "lite", "khan", "erik", "slug", + "loon", "dena", "ruse", "talk", "tusk", "gaol", "tads", "beds", "sock", "howe", "gave", "snob", + "ahab", "part", "meir", "jell", "stir", "tels", "spit", "hash", "omit", "jinx", "lyra", "puck", + "laue", "beep", "eros", "owed", "cede", "brew", "slue", "mitt", "jest", "lynx", "wads", "gena", + "dank", "volt", "gray", "pony", "veld", "bask", "fens", "argo", "work", "taxi", "afar", "boon", + "lube", "pass", "lazy", "mist", "blot", "mach", "poky", "rams", "sits", "rend", "dome", "pray", + "duck", "hers", "lure", "keep", "gory", "chat", "runt", "jams", "lays", "posy", "bats", "hoff", + "rock", "keri", "raul", "yves", "lama", "ramp", "vote", "jody", "pock", "gist", "sass", "iago", + "coos", "rank", "lowe", "vows", "koch", "taco", "jinn", "juno", "rape", "band", "aces", "goal", + "huck", "lila", "tuft", "swan", "blab", "leda", "gems", "hide", "tack", "porn", "scum", "frat", + "plum", "duds", "shad", "arms", "pare", "chin", "gain", "knee", "foot", "line", "dove", "vera", + "jays", "fund", "reno", "skid", "boys", "corn", "gwyn", "sash", "weld", "ruiz", "dior", "jess", + "leaf", "pars", "cote", "zing", "scat", "nice", "dart", "only", "owls", "hike", "trey", "whys", + "ding", "klan", "ross", "barb", "ants", "lean", "dopy", "hock", "tour", "grip", "aldo", "whim", + "prom", "rear", "dins", "duff", "dell", "loch", "lava", "sung", "yank", "thar", "curl", "venn", + "blow", "pomp", "heat", "trap", "dali", "nets", "seen", "gash", "twig", "dads", "emmy", "rhea", + "navy", "haws", "mite", "bows", "alas", "ives", "play", "soon", "doll", "chum", "ajar", "foam", + "call", "puke", "kris", "wily", "came", "ales", "reef", "raid", "diet", "prod", "prut", "loot", + "soar", "coed", "celt", "seam", "dray", "lump", "jags", "nods", "sole", "kink", "peso", "howl", + "cost", "tsar", "uric", "sore", "woes", "sewn", "sake", "cask", "caps", "burl", "tame", "bulk", + "neva", "from", "meet", "webs", "spar", "fuck", "buoy", "wept", "west", "dual", "pica", "sold", + "seed", "gads", "riff", "neck", "deed", "rudy", "drop", "vale", "flit", "romp", "peak", "jape", + "jews", "fain", "dens", "hugo", "elba", "mink", "town", "clam", "feud", "fern", "dung", "newt", + "mime", "deem", "inti", "gigs", "sosa", "lope", "lard", "cara", "smug", "lego", "flex", "doth", + "paar", "moon", "wren", "tale", "kant", "eels", "muck", "toga", "zens", "lops", "duet", "coil", + "gall", "teal", "glib", "muir", "ails", "boer", "them", "rake", "conn", "neat", "frog", "trip", + "coma", "must", "mono", "lira", "craw", "sled", "wear", "toby", "reel", "hips", "nate", "pump", + "mont", "died", "moss", "lair", "jibe", "oils", "pied", "hobs", "cads", "haze", "muse", "cogs", + "figs", "cues", "roes", "whet", "boru", "cozy", "amos", "tans", "news", "hake", "cots", "boas", + "tutu", "wavy", "pipe", "typo", "albs", "boom", "dyke", "wail", "woke", "ware", "rita", "fail", + "slab", "owes", "jane", "rack", "hell", "lags", "mend", "mask", "hume", "wane", "acne", "team", + "holy", "runs", "exes", "dole", "trim", "zola", "trek", "puma", "wacs", "veep", "yaps", "sums", + "lush", "tubs", "most", "witt", "bong", "rule", "hear", "awry", "sots", "nils", "bash", "gasp", + "inch", "pens", "fies", "juts", "pate", "vine", "zulu", "this", "bare", "veal", "josh", "reek", + "ours", "cowl", "club", "farm", "teat", "coat", "dish", "fore", "weft", "exam", "vlad", "floe", + "beak", "lane", "ella", "warp", "goth", "ming", "pits", "rent", "tito", "wish", "amps", "says", + "hawk", "ways", "punk", "nark", "cagy", "east", "paul", "bose", "solo", "teed", "text", "hews", + "snip", "lips", "emit", "orgy", "icon", "tuna", "soul", "kurd", "clod", "calk", "aunt", "bake", + "copy", "acid", "duse", "kiln", "spec", "fans", "bani", "irma", "pads", "batu", "logo", "pack", + "oder", "atop", "funk", "gide", "bede", "bibs", "taut", "guns", "dana", "puff", "lyme", "flat", + "lake", "june", "sets", "gull", "hops", "earn", "clip", "fell", "kama", "seal", "diaz", "cite", + "chew", "cuba", "bury", "yard", "bank", "byes", "apia", "cree", "nosh", "judo", "walk", "tape", + "taro", "boot", "cods", "lade", "cong", "deft", "slim", "jeri", "rile", "park", "aeon", "fact", + "slow", "goff", "cane", "earp", "tart", "does", "acts", "hope", "cant", "buts", "shin", "dude", + "ergo", "mode", "gene", "lept", "chen", "beta", "eden", "pang", "saab", "fang", "whir", "cove", + "perk", "fads", "rugs", "herb", "putt", "nous", "vane", "corm", "stay", "bids", "vela", "roof", + "isms", "sics", "gone", "swum", "wiry", "cram", "rink", "pert", "heap", "sikh", "dais", "cell", + "peel", "nuke", "buss", "rasp", "none", "slut", "bent", "dams", "serb", "dork", "bays", "kale", + "cora", "wake", "welt", "rind", "trot", "sloe", "pity", "rout", "eves", "fats", "furs", "pogo", + "beth", "hued", "edam", "iamb", "glee", "lute", "keel", "airy", "easy", "tire", "rube", "bogy", + "sine", "chop", "rood", "elbe", "mike", "garb", "jill", "gaul", "chit", "dons", "bars", "ride", + "beck", "toad", "make", "head", "suds", "pike", "snot", "swat", "peed", "same", "gaza", "lent", + "gait", "gael", "elks", "hang", "nerf", "rosy", "shut", "glop", "pain", "dion", "deaf", "hero", + "doer", "wost", "wage", "wash", "pats", "narc", "ions", "dice", "quay", "vied", "eons", "case", + "pour", "urns", "reva", "rags", "aden", "bone", "rang", "aura", "iraq", "toot", "rome", "hals", + "megs", "pond", "john", "yeps", "pawl", "warm", "bird", "tint", "jowl", "gibe", "come", "hold", + "pail", "wipe", "bike", "rips", "eery", "kent", "hims", "inks", "fink", "mott", "ices", "macy", + "serf", "keys", "tarp", "cops", "sods", "feet", "tear", "benz", "buys", "colo", "boil", "sews", + "enos", "watt", "pull", "brag", "cork", "save", "mint", "feat", "jamb", "rubs", "roxy", "toys", + "nosy", "yowl", "tamp", "lobs", "foul", "doom", "sown", "pigs", "hemp", "fame", "boor", "cube", + "tops", "loco", "lads", "eyre", "alta", "aged", "flop", "pram", "lesa", "sawn", "plow", "aral", + "load", "lied", "pled", "boob", "bert", "rows", "zits", "rick", "hint", "dido", "fist", "marc", + "wuss", "node", "smog", "nora", "shim", "glut", "bale", "perl", "what", "tort", "meek", "brie", + "bind", "cake", "psst", "dour", "jove", "tree", "chip", "stud", "thou", "mobs", "sows", "opts", + "diva", "perm", "wise", "cuds", "sols", "alan", "mild", "pure", "gail", "wins", "offs", "nile", + "yelp", "minn", "tors", "tran", "homy", "sadr", "erse", "nero", "scab", "finn", "mich", "turd", + "then", "poem", "noun", "oxus", "brow", "door", "saws", "eben", "wart", "wand", "rosa", "left", + "lina", "cabs", "rapt", "olin", "suet", "kalb", "mans", "dawn", "riel", "temp", "chug", "peal", + "drew", "null", "hath", "many", "took", "fond", "gate", "sate", "leak", "zany", "vans", "mart", + "hess", "home", "long", "dirk", "bile", "lace", "moog", "axes", "zone", "fork", "duct", "rico", + "rife", "deep", "tiny", "hugh", "bilk", "waft", "swig", "pans", "with", "kern", "busy", "film", + "lulu", "king", "lord", "veda", "tray", "legs", "soot", "ells", "wasp", "hunt", "earl", "ouch", + "diem", "yell", "pegs", "blvd", "polk", "soda", "zorn", "liza", "slop", "week", "kill", "rusk", + "eric", "sump", "haul", "rims", "crop", "blob", "face", "bins", "read", "care", "pele", "ritz", + "beau", "golf", "drip", "dike", "stab", "jibs", "hove", "junk", "hoax", "tats", "fief", "quad", + "peat", "ream", "hats", "root", "flak", "grit", "clap", "pugh", "bosh", "lock", "mute", "crow", + "iced", "lisa", "bela", "fems", "oxes", "vies", "gybe", "huff", "bull", "cuss", "sunk", "pups", + "fobs", "turf", "sect", "atom", "debt", "sane", "writ", "anon", "mayo", "aria", "seer", "thor", + "brim", "gawk", "jack", "jazz", "menu", "yolk", "surf", "libs", "lets", "bans", "toil", "open", + "aced", "poor", "mess", "wham", "fran", "gina", "dote", "love", "mood", "pale", "reps", "ines", + "shot", "alar", "twit", "site", "dill", "yoga", "sear", "vamp", "abel", "lieu", "cuff", "orbs", + "rose", "tank", "gape", "guam", "adar", "vole", "your", "dean", "dear", "hebe", "crab", "hump", + "mole", "vase", "rode", "dash", "sera", "balk", "lela", "inca", "gaea", "bush", "loud", "pies", + "aide", "blew", "mien", "side", "kerr", "ring", "tess", "prep", "rant", "lugs", "hobo", "joke", + "odds", "yule", "aida", "true", "pone", "lode", "nona", "weep", "coda", "elmo", "skim", "wink", + "bras", "pier", "bung", "pets", "tabs", "ryan", "jock", "body", "sofa", "joey", "zion", "mace", + "kick", "vile", "leno", "bali", "fart", "that", "redo", "ills", "jogs", "pent", "drub", "slaw", + "tide", "lena", "seep", "gyps", "wave", "amid", "fear", "ties", "flan", "wimp", "kali", "shun", + "crap", "sage", "rune", "logs", "cain", "digs", "abut", "obit", "paps", "rids", "fair", "hack", + "huns", "road", "caws", "curt", "jute", "fisk", "fowl", "duty", "holt", "miss", "rude", "vito", + "baal", "ural", "mann", "mind", "belt", "clem", "last", "musk", "roam", "abed", "days", "bore", + "fuze", "fall", "pict", "dump", "dies", "fiat", "vent", "pork", "eyed", "docs", "rive", "spas", + "rope", "ariz", "tout", "game", "jump", "blur", "anti", "lisp", "turn", "sand", "food", "moos", + "hoop", "saul", "arch", "fury", "rise", "diss", "hubs", "burs", "grid", "ilks", "suns", "flea", + "soil", "lung", "want", "nola", "fins", "thud", "kidd", "juan", "heps", "nape", "rash", "burt", + "bump", "tots", "brit", "mums", "bole", "shah", "tees", "skip", "limb", "umps", "ache", "arcs", + "raft", "halo", "luce", "bahs", "leta", "conk", "duos", "siva", "went", "peek", "sulk", "reap", + "free", "dubs", "lang", "toto", "hasp", "ball", "rats", "nair", "myst", "wang", "snug", "nash", + "laos", "ante", "opal", "tina", "pore", "bite", "haas", "myth", "yugo", "foci", "dent", "bade", + "pear", "mods", "auto", "shop", "etch", "lyly", "curs", "aron", "slew", "tyro", "sack", "wade", + "clio", "gyro", "butt", "icky", "char", "itch", "halt", "gals", "yang", "tend", "pact", "bees", + "suit", "puny", "hows", "nina", "brno", "oops", "lick", "sons", "kilo", "bust", "nome", "mona", + "dull", "join", "hour", "papa", "stag", "bern", "wove", "lull", "slip", "laze", "roil", "alto", + "bath", "buck", "alma", "anus", "evil", "dumb", "oreo", "rare", "near", "cure", "isis", "hill", + "kyle", "pace", "comb", "nits", "flip", "clop", "mort", "thea", "wall", "kiel", "judd", "coop", + "dave", "very", "amie", "blah", "flub", "talc", "bold", "fogy", "idea", "prof", "horn", "shoo", + "aped", "pins", "helm", "wees", "beer", "womb", "clue", "alba", "aloe", "fine", "bard", "limo", + "shaw", "pint", "swim", "dust", "indy", "hale", "cats", "troy", "wens", "luke", "vern", "deli", + "both", "brig", "daub", "sara", "sued", "bier", "noel", "olga", "dupe", "look", "pisa", "knox", + "murk", "dame", "matt", "gold", "jame", "toge", "luck", "peck", "tass", "calf", "pill", "wore", + "wadi", "thur", "parr", "maul", "tzar", "ones", "lees", "dark", "fake", "bast", "zoom", "here", + "moro", "wine", "bums", "cows", "jean", "palm", "fume", "plop", "help", "tuba", "leap", "cans", + "back", "avid", "lice", "lust", "polo", "dory", "stew", "kate", "rama", "coke", "bled", "mugs", + "ajax", "arts", "drug", "pena", "cody", "hole", "sean", "deck", "guts", "kong", "bate", "pitt", + "como", "lyle", "siam", "rook", "baby", "jigs", "bret", "bark", "lori", "reba", "sups", "made", + "buzz", "gnaw", "alps", "clay", "post", "viol", "dina", "card", "lana", "doff", "yups", "tons", + "live", "kids", "pair", "yawl", "name", "oven", "sirs", "gyms", "prig", "down", "leos", "noon", + "nibs", "cook", "safe", "cobb", "raja", "awes", "sari", "nerd", "fold", "lots", "pete", "deal", + "bias", "zeal", "girl", "rage", "cool", "gout", "whey", "soak", "thaw", "bear", "wing", "nagy", + "well", "oink", "sven", "kurt", "etna", "held", "wood", "high", "feta", "twee", "ford", "cave", + "knot", "tory", "ibis", "yaks", "vets", "foxy", "sank", "cone", "pius", "tall", "seem", "wool", + "flap", "gird", "lore", "coot", "mewl", "sere", "real", "puts", "sell", "nuts", "foil", "lilt", + "saga", "heft", "dyed", "goat", "spew", "daze", "frye", "adds", "glen", "tojo", "pixy", "gobi", + "stop", "tile", "hiss", "shed", "hahn", "baku", "ahas", "sill", "swap", "also", "carr", "manx", + "lime", "debs", "moat", "eked", "bola", "pods", "coon", "lacy", "tube", "minx", "buff", "pres", + "clew", "gaff", "flee", "burn", "whom", "cola", "fret", "purl", "wick", "wigs", "donn", "guys", + "toni", "oxen", "wite", "vial", "spam", "huts", "vats", "lima", "core", "eula", "thad", "peon", + "erie", "oats", "boyd", "cued", "olaf", "tams", "secs", "urey", "wile", "penn", "bred", "rill", + "vary", "sues", "mail", "feds", "aves", "code", "beam", "reed", "neil", "hark", "pols", "gris", + "gods", "mesa", "test", "coup", "heed", "dora", "hied", "tune", "doze", "pews", "oaks", "bloc", + "tips", "maid", "goof", "four", "woof", "silo", "bray", "zest", "kiss", "yong", "file", "hilt", + "iris", "tuns", "lily", "ears", "pant", "jury", "taft", "data", "gild", "pick", "kook", "colt", + "bohr", "anal", "asps", "babe", "bach", "mash", "biko", "bowl", "huey", "jilt", "goes", "guff", + "bend", "nike", "tami", "gosh", "tike", "gees", "urge", "path", "bony", "jude", "lynn", "lois", + "teas", "dunn", "elul", "bonn", "moms", "bugs", "slay", "yeah", "loan", "hulk", "lows", "damn", + "nell", "jung", "avis", "mane", "waco", "loin", "knob", "tyke", "anna", "hire", "luau", "tidy", + "nuns", "pots", "quid", "exec", "hans", "hera", "hush", "shag", "scot", "moan", "wald", "ursa", + "lorn", "hunk", "loft", "yore", "alum", "mows", "slog", "emma", "spud", "rice", "worn", "erma", + "need", "bags", "lark", "kirk", "pooh", "dyes", "area", "dime", "luvs", "foch", "refs", "cast", + "alit", "tugs", "even", "role", "toed", "caph", "nigh", "sony", "bide", "robs", "folk", "daft", + "past", "blue", "flaw", "sana", "fits", "barr", "riot", "dots", "lamp", "cock", "fibs", "harp", + "tent", "hate", "mali", "togs", "gear", "tues", "bass", "pros", "numb", "emus", "hare", "fate", + "wife", "mean", "pink", "dune", "ares", "dine", "oily", "tony", "czar", "spay", "push", "glum", + "till", "moth", "glue", "dive", "scad", "pops", "woks", "andy", "leah", "cusp", "hair", "alex", + "vibe", "bulb", "boll", "firm", "joys", "tara", "cole", "levy", "owen", "chow", "rump", "jail", + "lapp", "beet", "slap", "kith", "more", "maps", "bond", "hick", "opus", "rust", "wist", "shat", + "phil", "snow", "lott", "lora", "cary", "mote", "rift", "oust", "klee", "goad", "pith", "heep", + "lupe", "ivan", "mimi", "bald", "fuse", "cuts", "lens", "leer", "eyry", "know", "razz", "tare", + "pals", "geek", "greg", "teen", "clef", "wags", "weal", "each", "haft", "nova", "waif", "rate", + "katy", "yale", "dale", "leas", "axum", "quiz", "pawn", "fend", "capt", "laws", "city", "chad", + "coal", "nail", "zaps", "sort", "loci", "less", "spur", "note", "foes", "fags", "gulp", "snap", + "bogs", "wrap", "dane", "melt", "ease", "felt", "shea", "calm", "star", "swam", "aery", "year", + "plan", "odin", "curd", "mira", "mops", "shit", "davy", "apes", "inky", "hues", "lome", "bits", + "vila", "show", "best", "mice", "gins", "next", "roan", "ymir", "mars", "oman", "wild", "heal", + "plus", "erin", "rave", "robe", "fast", "hutu", "aver", "jodi", "alms", "yams", "zero", "revs", + "wean", "chic", "self", "jeep", "jobs", "waxy", "duel", "seek", "spot", "raps", "pimp", "adan", + "slam", "tool", "morn", "futz", "ewes", "errs", "knit", "rung", "kans", "muff", "huhs", "tows", + "lest", "meal", "azov", "gnus", "agar", "sips", "sway", "otis", "tone", "tate", "epic", "trio", + "tics", "fade", "lear", "owns", "robt", "weds", "five", "lyon", "terr", "arno", "mama", "grey", + "disk", "sept", "sire", "bart", "saps", "whoa", "turk", "stow", "pyle", "joni", "zinc", "negs", + "task", "leif", "ribs", "malt", "nine", "bunt", "grin", "dona", "nope", "hams", "some", "molt", + "smit", "sacs", "joan", "slav", "lady", "base", "heck", "list", "take", "herd", "will", "nubs", + "burg", "hugs", "peru", "coif", "zoos", "nick", "idol", "levi", "grub", "roth", "adam", "elma", + "tags", "tote", "yaws", "cali", "mete", "lula", "cubs", "prim", "luna", "jolt", "span", "pita", + "dodo", "puss", "deer", "term", "dolt", "goon", "gary", "yarn", "aims", "just", "rena", "tine", + "cyst", "meld", "loki", "wong", "were", "hung", "maze", "arid", "cars", "wolf", "marx", "faye", + "eave", "raga", "flow", "neal", "lone", "anne", "cage", "tied", "tilt", "soto", "opel", "date", + "buns", "dorm", "kane", "akin", "ewer", "drab", "thai", "jeer", "grad", "berm", "rods", "saki", + "grus", "vast", "late", "lint", "mule", "risk", "labs", "snit", "gala", "find", "spin", "ired", + "slot", "oafs", "lies", "mews", "wino", "milk", "bout", "onus", "tram", "jaws", "peas", "cleo", + "seat", "gums", "cold", "vang", "dewy", "hood", "rush", "mack", "yuan", "odes", "boos", "jami", + "mare", "plot", "swab", "borg", "hays", "form", "mesh", "mani", "fife", "good", "gram", "lion", + "myna", "moor", "skin", "posh", "burr", "rime", "done", "ruts", "pays", "stem", "ting", "arty", + "slag", "iron", "ayes", "stub", "oral", "gets", "chid", "yens", "snub", "ages", "wide", "bail", + "verb", "lamb", "bomb", "army", "yoke", "gels", "tits", "bork", "mils", "nary", "barn", "hype", + "odom", "avon", "hewn", "rios", "cams", "tact", "boss", "oleo", "duke", "eris", "gwen", "elms", + "deon", "sims", "quit", "nest", "font", "dues", "yeas", "zeta", "bevy", "gent", "torn", "cups", + "worm", "baum", "axon", "purr", "vise", "grew", "govs", "meat", "chef", "rest", "lame"])) diff --git a/Week_03/id_3/dfs/LeetCode_127_3_v2.py b/Week_03/id_3/dfs/LeetCode_127_3_v2.py new file mode 100644 index 00000000..015004ba --- /dev/null +++ b/Week_03/id_3/dfs/LeetCode_127_3_v2.py @@ -0,0 +1,61 @@ +""" +似乎DFS不行, 时间不受控制,试试双向BFS +""" + + +class Solution: + def ladderLength(self, begin, end, word_list) -> int: + if not begin or not end or not word_list or end not in word_list: + return 0 + + word_graph = {} + for w in word_list: + for i in range(len(w)): + k = w[0:i] + '*' + w[i+1:] + arr = word_graph.get(k, []) + arr.append(w) + word_graph[k] = arr + + begin_set = set() + end_set = set([end]) + count = 0 + begin_queue = [begin] + end_queue = [end] + + while True: + if not begin_queue and not end_queue: + return 0 + if count % 2 == 0: + queue = begin_queue + cur_set, target_set = begin_set, end_set + else: + queue = end_queue + cur_set, target_set = end_set, begin_set + + _queue = [] + for w in queue: + for i in range(len(w)): + k = w[0:i] + '*' + w[i+1:] + if k not in word_graph: + continue + for sw in word_graph[k]: + if sw in cur_set: + continue + if sw in target_set: + return count + 2 + else: + cur_set.add(sw) + _queue.append(sw) + if count % 2 == 0: + begin_queue = _queue + else: + end_queue = _queue + count += 1 + + return 0 + + +s = Solution() +# print(s.ladderLength("hit", "cog", ["hot", "dot", "dog", "lot", "log", "cog"])) +# print(s.ladderLength("hit", "cog", ["hot", "dot", "dog", "lot"])) +print(s.ladderLength("hot", "dog", ["hot", "dog"])) From 94f68b6c13b8477f7cbce0ef36783e5d32c83b29 Mon Sep 17 00:00:00 2001 From: yujingwen Date: Sun, 23 Jun 2019 04:27:21 +0800 Subject: [PATCH 74/75] =?UTF-8?q?103=20=E4=BC=98=E5=8C=96=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_02/id_3/tree/LeetCode_103_3_v1.py | 4 +++ Week_02/id_3/tree/LeetCode_103_3_v2.py | 5 ++++ Week_03/id_3/bfs/LeetCode_103_3.py | 40 ++++++++++++++++++++++++++ 3 files changed, 49 insertions(+) create mode 100644 Week_03/id_3/bfs/LeetCode_103_3.py diff --git a/Week_02/id_3/tree/LeetCode_103_3_v1.py b/Week_02/id_3/tree/LeetCode_103_3_v1.py index 26f74423..81838d61 100644 --- a/Week_02/id_3/tree/LeetCode_103_3_v1.py +++ b/Week_02/id_3/tree/LeetCode_103_3_v1.py @@ -1,3 +1,7 @@ +""" +正常广度优先遍历 在插入结果的时候进行反转 +""" + class Solution: def zigzagLevelOrder(self, root): r = [] diff --git a/Week_02/id_3/tree/LeetCode_103_3_v2.py b/Week_02/id_3/tree/LeetCode_103_3_v2.py index ef9eedfb..a22d929e 100644 --- a/Week_02/id_3/tree/LeetCode_103_3_v2.py +++ b/Week_02/id_3/tree/LeetCode_103_3_v2.py @@ -1,3 +1,8 @@ +""" +复杂版本的实现 在插入和迭代的时候就直接有倒序的元素 +""" + + class Solution: def zigzagLevelOrder(self, root): r = [] diff --git a/Week_03/id_3/bfs/LeetCode_103_3.py b/Week_03/id_3/bfs/LeetCode_103_3.py new file mode 100644 index 00000000..085e7eab --- /dev/null +++ b/Week_03/id_3/bfs/LeetCode_103_3.py @@ -0,0 +1,40 @@ +""" +Week2做过 这里整理一下思路 +最简单的方式是BFS加上结果部分倒序 +复杂的方式则是在BFS的时候就进行倒序,减少一次倒序操作 +BFS由于有倒序层,而在倒序迭代倒序层的同时又要保证下一层顺序遍历。 +所以倒序层需要使用队列由后向前插入数据,并且先右后左 +例如 [1,2,3]倒序遍历,3的子节点[e,f]先f后e的插入队列前端 +这次使用collections的队列 +""" +import collections + + +class Solution: + def zigzagLevelOrder(self, root): + if not root: + return [] + results = [] + queue = collections.deque([root]) + while queue: + need_reverse = len(results) % 2 == 1 + result = [] + if need_reverse: + for _ in range(len(queue)): + node = queue.pop() + if not node: + continue + result.append(node.val) + node.right and queue.appendleft(node.right) + node.left and queue.appendleft(node.left) + else: + for _ in range(len(queue)): + node = queue.popleft() + if not node: + continue + result.append(node.val) + node.left and queue.append(node.left) + node.right and queue.append(node.right) + results.append(result) + + return results From e498d78b306528d6af6d8a1ceae5d222336eecd0 Mon Sep 17 00:00:00 2001 From: yujingwen Date: Mon, 24 Jun 2019 03:55:16 +0800 Subject: [PATCH 75/75] =?UTF-8?q?310=20=E6=9A=B4=E5=8A=9B=E8=B6=85?= =?UTF-8?q?=E6=97=B6=20=E5=8F=B6=E5=AD=90=E5=89=AA=E5=87=BA=20=E8=AE=A1?= =?UTF-8?q?=E6=95=B0=E5=99=A8=E4=B8=89=E7=A7=8D=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_03/id_3/bfs/LeetCode_310_3.py | 233 ++++++++++++++++++++++++++ Week_03/id_3/bfs/LeetCode_310_3_v2.py | 228 +++++++++++++++++++++++++ Week_03/id_3/bfs/LeetCode_310_3_v3.py | 227 +++++++++++++++++++++++++ 3 files changed, 688 insertions(+) create mode 100644 Week_03/id_3/bfs/LeetCode_310_3.py create mode 100644 Week_03/id_3/bfs/LeetCode_310_3_v2.py create mode 100644 Week_03/id_3/bfs/LeetCode_310_3_v3.py diff --git a/Week_03/id_3/bfs/LeetCode_310_3.py b/Week_03/id_3/bfs/LeetCode_310_3.py new file mode 100644 index 00000000..ab3665a2 --- /dev/null +++ b/Week_03/id_3/bfs/LeetCode_310_3.py @@ -0,0 +1,233 @@ +""" +思路大概就是BFS找出最小值 如果大于已有最小值则剪枝 +=========== 超时了 这个n^2的方案注定要优化 +这是一个失败的版本 v2是优化后的版本 +""" +import collections + + +class Solution: + def findMinHeightTrees(self, n, edges): + graph = {} + for i in range(n): + graph[i] = [] + for n1, n2 in edges: + graph[n1].append(n2) + graph[n2].append(n1) + + min_level = n + result = [] + queue = collections.deque() + if True: + print(self.bfs(3, graph, min_level, queue)) + return + for i in range(n): + count = self.bfs(i, graph, min_level, queue) + if count == min_level: + result.append(i) + elif count < min_level: + min_level = count + result = [i] + return result + + def bfs(self, i, graph, min_level, queue): + queue.appendleft(i) + visited = set() + count = 0 + while queue: + if count > min_level: + return count + print(queue) + for _ in range(len(queue)): + n = queue.pop() + visited.add(n) + for sn in graph[n]: + if sn in visited: + continue + queue.appendleft(sn) + count += 1 + return count + + +s = Solution() +# print(s.findMinHeightTrees(4, [[1, 0], [1, 2], [1, 3]])) +# print(s.findMinHeightTrees(6, [[0, 3], [1, 3], [2, 3], [4, 3], [5, 4]])) +print(s.findMinHeightTrees(1313, [[0, 1], [0, 2], [0, 3], [3, 4], [0, 5], [3, 6], [3, 7], [6, 8], [3, 9], [9, 10], [9, 11], + [10, 12], [3, 13], [2, 14], [5, 15], [1, 16], [5, 17], [15, 18], [17, 19], [12, 20], + [20, 21], [21, 22], [2, 23], [12, 24], [13, 25], [23, 26], [6, 27], [14, 28], [7, 29], + [14, 30], [28, 31], [3, 32], [20, 33], [6, 34], [28, 35], [14, 36], [12, 37], [25, 38], + [28, 39], [0, 40], [11, 41], [19, 42], [41, 43], [24, 44], [43, 45], [14, 46], [36, 47], + [26, 48], [16, 49], [42, 50], [43, 51], [11, 52], [7, 53], [50, 54], [17, 55], [9, 56], + [0, 57], [16, 58], [26, 59], [32, 60], [53, 61], [30, 62], [40, 63], [63, 64], [45, 65], + [13, 66], [24, 67], [42, 68], [2, 69], [63, 70], [39, 71], [34, 72], [20, 73], [20, 74], + [63, 75], [12, 76], [57, 77], [51, 78], [17, 79], [24, 80], [22, 81], [76, 82], [4, 83], + [16, 84], [75, 85], [21, 86], [21, 87], [8, 88], [28, 89], [85, 90], [31, 91], [53, 92], + [57, 93], [45, 94], [67, 95], [87, 96], [10, 97], [95, 98], [0, 99], [46, 100], [39, 101], + [47, 102], [101, 103], [72, 104], [2, 105], [3, 106], [78, 107], [32, 108], [23, 109], + [73, 110], [102, 111], [50, 112], [8, 113], [85, 114], [68, 115], [87, 116], [102, 117], + [77, 118], [62, 119], [70, 120], [86, 121], [13, 122], [101, 123], [69, 124], [37, 125], + [48, 126], [78, 127], [40, 128], [26, 129], [7, 130], [80, 131], [21, 132], [81, 133], + [62, 134], [97, 135], [71, 136], [123, 137], [78, 138], [16, 139], [5, 140], [10, 141], + [138, 142], [21, 143], [15, 144], [91, 145], [0, 146], [65, 147], [64, 148], [28, 149], + [86, 150], [28, 151], [111, 152], [140, 153], [138, 154], [77, 155], [145, 156], [50, 157], + [87, 158], [96, 159], [105, 160], [59, 161], [1, 162], [11, 163], [121, 164], [48, 165], + [119, 166], [133, 167], [26, 168], [92, 169], [63, 170], [158, 171], [164, 172], [115, 173], + [66, 174], [123, 175], [33, 176], [76, 177], [119, 178], [114, 179], [124, 180], [164, 181], + [85, 182], [143, 183], [110, 184], [53, 185], [120, 186], [78, 187], [131, 188], [185, 189], + [69, 190], [168, 191], [51, 192], [89, 193], [159, 194], [176, 195], [13, 196], [51, 197], + [6, 198], [28, 199], [46, 200], [105, 201], [167, 202], [148, 203], [19, 204], [204, 205], + [6, 206], [151, 207], [44, 208], [54, 209], [184, 210], [176, 211], [173, 212], [200, 213], + [203, 214], [106, 215], [87, 216], [1, 217], [173, 218], [103, 219], [160, 220], [118, 221], + [50, 222], [152, 223], [25, 224], [9, 225], [64, 226], [6, 227], [61, 228], [144, 229], + [212, 230], [166, 231], [30, 232], [196, 233], [215, 234], [109, 235], [183, 236], + [13, 237], [183, 238], [18, 239], [149, 240], [189, 241], [149, 242], [157, 243], + [116, 244], [99, 245], [30, 246], [56, 247], [239, 248], [239, 249], [57, 250], [31, 251], + [189, 252], [101, 253], [101, 254], [110, 255], [1, 256], [113, 257], [161, 258], [25, 259], + [44, 260], [194, 261], [137, 262], [218, 263], [183, 264], [228, 265], [153, 266], + [136, 267], [201, 268], [265, 269], [116, 270], [236, 271], [32, 272], [70, 273], + [104, 274], [82, 275], [198, 276], [44, 277], [262, 278], [269, 279], [26, 280], [91, 281], + [180, 282], [157, 283], [36, 284], [215, 285], [183, 286], [1, 287], [39, 288], [164, 289], + [110, 290], [266, 291], [208, 292], [258, 293], [68, 294], [1, 295], [100, 296], [16, 297], + [107, 298], [135, 299], [55, 300], [226, 301], [155, 302], [68, 303], [32, 304], [149, 305], + [217, 306], [186, 307], [69, 308], [244, 309], [14, 310], [216, 311], [211, 312], + [232, 313], [148, 314], [85, 315], [91, 316], [168, 317], [90, 318], [228, 319], [216, 320], + [51, 321], [31, 322], [230, 323], [160, 324], [200, 325], [94, 326], [282, 327], [162, 328], + [130, 329], [87, 330], [29, 331], [295, 332], [32, 333], [136, 334], [219, 335], [218, 336], + [25, 337], [233, 338], [55, 339], [130, 340], [319, 341], [165, 342], [255, 343], [15, 344], + [342, 345], [74, 346], [172, 347], [28, 348], [255, 349], [47, 350], [193, 351], [19, 352], + [303, 353], [205, 354], [174, 355], [172, 356], [260, 357], [243, 358], [186, 359], + [181, 360], [51, 361], [34, 362], [31, 363], [283, 364], [283, 365], [122, 366], [137, 367], + [225, 368], [296, 369], [346, 370], [235, 371], [278, 372], [116, 373], [31, 374], + [248, 375], [89, 376], [20, 377], [287, 378], [222, 379], [33, 380], [3, 381], [140, 382], + [185, 383], [255, 384], [241, 385], [164, 386], [185, 387], [208, 388], [347, 389], + [235, 390], [157, 391], [88, 392], [138, 393], [163, 394], [69, 395], [241, 396], + [307, 397], [271, 398], [248, 399], [346, 400], [265, 401], [90, 402], [249, 403], + [43, 404], [10, 405], [159, 406], [383, 407], [174, 408], [292, 409], [288, 410], + [149, 411], [244, 412], [174, 413], [201, 414], [287, 415], [94, 416], [102, 417], + [123, 418], [10, 419], [332, 420], [192, 421], [377, 422], [136, 423], [119, 424], + [187, 425], [128, 426], [413, 427], [3, 428], [255, 429], [410, 430], [303, 431], + [424, 432], [311, 433], [246, 434], [366, 435], [378, 436], [360, 437], [120, 438], + [90, 439], [353, 440], [126, 441], [78, 442], [23, 443], [115, 444], [6, 445], [359, 446], + [338, 447], [180, 448], [71, 449], [190, 450], [128, 451], [408, 452], [341, 453], + [426, 454], [14, 455], [455, 456], [411, 457], [107, 458], [450, 459], [351, 460], + [235, 461], [422, 462], [316, 463], [272, 464], [204, 465], [102, 466], [145, 467], + [20, 468], [326, 469], [186, 470], [266, 471], [127, 472], [144, 473], [112, 474], + [151, 475], [200, 476], [185, 477], [291, 478], [438, 479], [422, 480], [377, 481], + [261, 482], [437, 483], [204, 484], [324, 485], [402, 486], [106, 487], [268, 488], + [237, 489], [49, 490], [253, 491], [256, 492], [8, 493], [115, 494], [46, 495], [101, 496], + [325, 497], [90, 498], [146, 499], [252, 500], [255, 501], [277, 502], [129, 503], + [339, 504], [6, 505], [462, 506], [363, 507], [421, 508], [7, 509], [279, 510], [361, 511], + [35, 512], [112, 513], [113, 514], [194, 515], [128, 516], [65, 517], [26, 518], [305, 519], + [97, 520], [352, 521], [283, 522], [4, 523], [497, 524], [385, 525], [212, 526], [76, 527], + [92, 528], [194, 529], [344, 530], [510, 531], [461, 532], [89, 533], [228, 534], [97, 535], + [194, 536], [446, 537], [100, 538], [120, 539], [257, 540], [46, 541], [230, 542], + [357, 543], [365, 544], [265, 545], [123, 546], [290, 547], [100, 548], [194, 549], + [134, 550], [538, 551], [114, 552], [52, 553], [251, 554], [236, 555], [416, 556], + [264, 557], [461, 558], [14, 559], [376, 560], [254, 561], [422, 562], [233, 563], + [409, 564], [14, 565], [190, 566], [151, 567], [543, 568], [516, 569], [369, 570], + [432, 571], [343, 572], [341, 573], [531, 574], [77, 575], [394, 576], [471, 577], + [293, 578], [428, 579], [360, 580], [524, 581], [471, 582], [63, 583], [556, 584], + [254, 585], [583, 586], [491, 587], [460, 588], [250, 589], [329, 590], [504, 591], + [414, 592], [353, 593], [172, 594], [582, 595], [474, 596], [19, 597], [327, 598], + [464, 599], [39, 600], [278, 601], [234, 602], [131, 603], [569, 604], [466, 605], + [354, 606], [160, 607], [466, 608], [283, 609], [39, 610], [321, 611], [440, 612], + [280, 613], [142, 614], [9, 615], [411, 616], [519, 617], [317, 618], [278, 619], + [412, 620], [352, 621], [96, 622], [540, 623], [1, 624], [370, 625], [274, 626], [277, 627], + [30, 628], [79, 629], [134, 630], [435, 631], [21, 632], [437, 633], [285, 634], [461, 635], + [122, 636], [137, 637], [550, 638], [399, 639], [490, 640], [405, 641], [358, 642], + [205, 643], [352, 644], [544, 645], [319, 646], [412, 647], [554, 648], [561, 649], + [100, 650], [361, 651], [130, 652], [151, 653], [547, 654], [543, 655], [230, 656], + [34, 657], [240, 658], [533, 659], [220, 660], [551, 661], [635, 662], [298, 663], + [510, 664], [32, 665], [56, 666], [271, 667], [386, 668], [328, 669], [511, 670], + [648, 671], [213, 672], [640, 673], [620, 674], [292, 675], [612, 676], [231, 677], + [519, 678], [218, 679], [158, 680], [284, 681], [149, 682], [180, 683], [465, 684], + [101, 685], [97, 686], [592, 687], [577, 688], [501, 689], [130, 690], [574, 691], + [483, 692], [617, 693], [461, 694], [308, 695], [614, 696], [90, 697], [362, 698], + [313, 699], [301, 700], [562, 701], [41, 702], [627, 703], [408, 704], [476, 705], + [161, 706], [282, 707], [481, 708], [209, 709], [576, 710], [437, 711], [10, 712], + [548, 713], [256, 714], [498, 715], [129, 716], [664, 717], [70, 718], [185, 719], + [629, 720], [108, 721], [360, 722], [503, 723], [105, 724], [213, 725], [177, 726], + [46, 727], [104, 728], [398, 729], [209, 730], [89, 731], [499, 732], [368, 733], + [680, 734], [362, 735], [534, 736], [443, 737], [562, 738], [74, 739], [353, 740], + [165, 741], [108, 742], [438, 743], [131, 744], [140, 745], [37, 746], [28, 747], + [698, 748], [523, 749], [113, 750], [430, 751], [695, 752], [670, 753], [546, 754], + [366, 755], [369, 756], [602, 757], [415, 758], [291, 759], [352, 760], [560, 761], + [569, 762], [681, 763], [55, 764], [381, 765], [324, 766], [740, 767], [308, 768], + [728, 769], [374, 770], [118, 771], [97, 772], [646, 773], [6, 774], [626, 775], [444, 776], + [252, 777], [391, 778], [503, 779], [760, 780], [451, 781], [728, 782], [553, 783], + [410, 784], [487, 785], [343, 786], [350, 787], [579, 788], [3, 789], [706, 790], + [213, 791], [212, 792], [792, 793], [99, 794], [534, 795], [63, 796], [167, 797], + [109, 798], [692, 799], [597, 800], [742, 801], [407, 802], [256, 803], [442, 804], + [587, 805], [313, 806], [652, 807], [602, 808], [665, 809], [330, 810], [508, 811], + [683, 812], [598, 813], [661, 814], [709, 815], [594, 816], [337, 817], [219, 818], + [113, 819], [306, 820], [651, 821], [352, 822], [742, 823], [37, 824], [464, 825], + [452, 826], [165, 827], [774, 828], [17, 829], [280, 830], [511, 831], [542, 832], + [439, 833], [581, 834], [687, 835], [758, 836], [618, 837], [378, 838], [697, 839], + [769, 840], [702, 841], [606, 842], [105, 843], [663, 844], [157, 845], [441, 846], + [348, 847], [676, 848], [775, 849], [446, 850], [722, 851], [572, 852], [191, 853], + [765, 854], [710, 855], [569, 856], [134, 857], [596, 858], [304, 859], [20, 860], + [812, 861], [606, 862], [689, 863], [402, 864], [275, 865], [367, 866], [638, 867], + [618, 868], [231, 869], [367, 870], [255, 871], [740, 872], [232, 873], [571, 874], + [668, 875], [72, 876], [483, 877], [599, 878], [631, 879], [420, 880], [352, 881], + [289, 882], [720, 883], [556, 884], [430, 885], [410, 886], [728, 887], [412, 888], + [682, 889], [839, 890], [59, 891], [233, 892], [272, 893], [688, 894], [431, 895], + [310, 896], [407, 897], [567, 898], [743, 899], [811, 900], [808, 901], [246, 902], + [236, 903], [895, 904], [657, 905], [393, 906], [143, 907], [442, 908], [898, 909], + [72, 910], [282, 911], [901, 912], [624, 913], [697, 914], [484, 915], [582, 916], [4, 917], + [186, 918], [426, 919], [753, 920], [513, 921], [504, 922], [821, 923], [549, 924], + [415, 925], [634, 926], [505, 927], [590, 928], [866, 929], [267, 930], [236, 931], + [343, 932], [693, 933], [116, 934], [543, 935], [463, 936], [880, 937], [126, 938], + [832, 939], [205, 940], [33, 941], [284, 942], [941, 943], [940, 944], [943, 945], + [784, 946], [785, 947], [498, 948], [898, 949], [715, 950], [238, 951], [389, 952], + [951, 953], [511, 954], [767, 955], [332, 956], [300, 957], [298, 958], [317, 959], + [221, 960], [253, 961], [438, 962], [751, 963], [492, 964], [384, 965], [274, 966], + [820, 967], [376, 968], [159, 969], [766, 970], [909, 971], [669, 972], [8, 973], + [957, 974], [539, 975], [844, 976], [470, 977], [80, 978], [641, 979], [172, 980], + [962, 981], [756, 982], [195, 983], [131, 984], [216, 985], [503, 986], [330, 987], + [863, 988], [446, 989], [673, 990], [760, 991], [871, 992], [903, 993], [47, 994], + [810, 995], [736, 996], [749, 997], [951, 998], [348, 999], [741, 1000], [448, 1001], + [809, 1002], [704, 1003], [702, 1004], [113, 1005], [392, 1006], [216, 1007], [58, 1008], + [348, 1009], [170, 1010], [695, 1011], [168, 1012], [752, 1013], [168, 1014], [376, 1015], + [856, 1016], [302, 1017], [278, 1018], [554, 1019], [844, 1020], [368, 1021], [555, 1022], + [283, 1023], [220, 1024], [907, 1025], [356, 1026], [415, 1027], [977, 1028], [433, 1029], + [741, 1030], [702, 1031], [202, 1032], [420, 1033], [773, 1034], [929, 1035], [1020, 1036], + [752, 1037], [846, 1038], [909, 1039], [137, 1040], [752, 1041], [728, 1042], [295, 1043], + [998, 1044], [52, 1045], [825, 1046], [727, 1047], [871, 1048], [941, 1049], [342, 1050], + [579, 1051], [424, 1052], [756, 1053], [50, 1054], [587, 1055], [447, 1056], [1042, 1057], + [171, 1058], [322, 1059], [1049, 1060], [189, 1061], [384, 1062], [403, 1063], [468, 1064], + [666, 1065], [282, 1066], [271, 1067], [407, 1068], [323, 1069], [52, 1070], [571, 1071], + [46, 1072], [412, 1073], [616, 1074], [417, 1075], [1042, 1076], [657, 1077], [940, 1078], + [498, 1079], [597, 1080], [95, 1081], [12, 1082], [541, 1083], [519, 1084], [463, 1085], + [848, 1086], [1000, 1087], [788, 1088], [337, 1089], [1001, 1090], [267, 1091], [378, 1092], + [234, 1093], [907, 1094], [826, 1095], [31, 1096], [188, 1097], [502, 1098], [826, 1099], + [948, 1100], [879, 1101], [388, 1102], [34, 1103], [461, 1104], [568, 1105], [79, 1106], + [319, 1107], [364, 1108], [190, 1109], [605, 1110], [717, 1111], [622, 1112], [385, 1113], + [25, 1114], [835, 1115], [1033, 1116], [1085, 1117], [240, 1118], [199, 1119], [693, 1120], + [68, 1121], [478, 1122], [95, 1123], [842, 1124], [1109, 1125], [678, 1126], [104, 1127], + [918, 1128], [414, 1129], [768, 1130], [421, 1131], [825, 1132], [636, 1133], [290, 1134], + [1083, 1135], [473, 1136], [616, 1137], [1094, 1138], [28, 1139], [137, 1140], [590, 1141], + [654, 1142], [1140, 1143], [789, 1144], [670, 1145], [475, 1146], [176, 1147], [27, 1148], + [1106, 1149], [430, 1150], [192, 1151], [869, 1152], [546, 1153], [955, 1154], [493, 1155], + [643, 1156], [663, 1157], [702, 1158], [823, 1159], [1022, 1160], [228, 1161], [578, 1162], + [655, 1163], [611, 1164], [650, 1165], [1093, 1166], [1052, 1167], [966, 1168], + [1095, 1169], [93, 1170], [632, 1171], [875, 1172], [254, 1173], [629, 1174], [55, 1175], + [1134, 1176], [765, 1177], [210, 1178], [388, 1179], [323, 1180], [479, 1181], [160, 1182], + [1174, 1183], [489, 1184], [62, 1185], [875, 1186], [584, 1187], [56, 1188], [1175, 1189], + [592, 1190], [669, 1191], [330, 1192], [876, 1193], [134, 1194], [43, 1195], [1035, 1196], + [760, 1197], [680, 1198], [367, 1199], [409, 1200], [339, 1201], [772, 1202], [1120, 1203], + [347, 1204], [426, 1205], [384, 1206], [1079, 1207], [454, 1208], [313, 1209], [245, 1210], + [61, 1211], [874, 1212], [885, 1213], [702, 1214], [327, 1215], [452, 1216], [1160, 1217], + [1173, 1218], [872, 1219], [905, 1220], [752, 1221], [918, 1222], [624, 1223], [1023, 1224], + [288, 1225], [479, 1226], [982, 1227], [1103, 1228], [1113, 1229], [695, 1230], [760, 1231], + [789, 1232], [592, 1233], [902, 1234], [1164, 1235], [113, 1236], [1098, 1237], [229, 1238], + [99, 1239], [697, 1240], [320, 1241], [464, 1242], [727, 1243], [761, 1244], [307, 1245], + [1215, 1246], [990, 1247], [859, 1248], [598, 1249], [998, 1250], [156, 1251], [489, 1252], + [815, 1253], [1003, 1254], [535, 1255], [1008, 1256], [246, 1257], [808, 1258], [569, 1259], + [148, 1260], [326, 1261], [40, 1262], [68, 1263], [880, 1264], [391, 1265], [189, 1266], + [1035, 1267], [193, 1268], [338, 1269], [77, 1270], [496, 1271], [322, 1272], [1050, 1273], + [801, 1274], [1211, 1275], [134, 1276], [968, 1277], [296, 1278], [930, 1279], [657, 1280], + [890, 1281], [85, 1282], [1007, 1283], [1194, 1284], [80, 1285], [1191, 1286], [178, 1287], + [1162, 1288], [289, 1289], [1099, 1290], [666, 1291], [291, 1292], [435, 1293], [6, 1294], + [1060, 1295], [219, 1296], [1216, 1297], [1282, 1298], [636, 1299], [960, 1300], + [558, 1301], [885, 1302], [603, 1303], [1261, 1304], [728, 1305], [915, 1306], [818, 1307], + [943, 1308], [260, 1309], [1004, 1310], [325, 1311], [875, 1312]])) diff --git a/Week_03/id_3/bfs/LeetCode_310_3_v2.py b/Week_03/id_3/bfs/LeetCode_310_3_v2.py new file mode 100644 index 00000000..1309e579 --- /dev/null +++ b/Week_03/id_3/bfs/LeetCode_310_3_v2.py @@ -0,0 +1,228 @@ +""" +寻找最小高度的根节点,从每一个节点然后向下遍历,最后比较最小值。这个思路是n^2的时间复杂度,无法通过测试。 +从叶子节点反向bfs,找到所有叶子节点最后的根节点,反倒合理的方案。 O(n) +如果 bfs 中出现 一个节点的边除去已经迭代过的子节点外,存在多余一个的边,那么说明改节点不应该继续进行迭代 + +这个有点儿像是拓扑排序,从叶子节点向根节点推进,如果一个叶子节点的父节点还有除该叶子节点以外的节点, +则说明还有其他高度更高的子树没有迭代上来,需要继续等待. + +如此就可以找到整个图最平衡的1-2个节点 + +v2实现参考了网上常见的叶子剪出答案 +""" + + +class Solution: + def findMinHeightTrees(self, n, edges): + if n == 0: + return [] + if n == 1: + return [0] + + graph = {} + for i in range(n): + graph[i] = set() + for n1, n2 in edges: + graph[n1].add(n2) + graph[n2].add(n1) + + leaves = list(filter(lambda x: len(graph[x]) == 1, graph)) + while True: + _leaves = list() + for i in leaves: + parent_set = graph.pop(i) + if len(parent_set) == 0: + continue + j = parent_set.pop() + parent_edges = graph[j] + parent_edges.remove(i) + if len(parent_edges) == 1: + _leaves.append(j) + + if len(_leaves) == 0: + return list(leaves) + + leaves = _leaves + + +s = Solution() +# print(s.findMinHeightTrees(6, [[0, 3], [1, 3], [2, 3], [4, 3], [5, 4]])) +print(s.findMinHeightTrees(1313, [[0, 1], [0, 2], [0, 3], [3, 4], [0, 5], [3, 6], [3, 7], [6, 8], [3, 9], [9, 10], [9, 11], + [10, 12], [3, 13], [2, 14], [5, 15], [1, 16], [5, 17], [15, 18], [17, 19], [12, 20], + [20, 21], [21, 22], [2, 23], [12, 24], [13, 25], [23, 26], [6, 27], [14, 28], [7, 29], + [14, 30], [28, 31], [3, 32], [20, 33], [6, 34], [28, 35], [14, 36], [12, 37], [25, 38], + [28, 39], [0, 40], [11, 41], [19, 42], [41, 43], [24, 44], [43, 45], [14, 46], [36, 47], + [26, 48], [16, 49], [42, 50], [43, 51], [11, 52], [7, 53], [50, 54], [17, 55], [9, 56], + [0, 57], [16, 58], [26, 59], [32, 60], [53, 61], [30, 62], [40, 63], [63, 64], [45, 65], + [13, 66], [24, 67], [42, 68], [2, 69], [63, 70], [39, 71], [34, 72], [20, 73], [20, 74], + [63, 75], [12, 76], [57, 77], [51, 78], [17, 79], [24, 80], [22, 81], [76, 82], [4, 83], + [16, 84], [75, 85], [21, 86], [21, 87], [8, 88], [28, 89], [85, 90], [31, 91], [53, 92], + [57, 93], [45, 94], [67, 95], [87, 96], [10, 97], [95, 98], [0, 99], [46, 100], [39, 101], + [47, 102], [101, 103], [72, 104], [2, 105], [3, 106], [78, 107], [32, 108], [23, 109], + [73, 110], [102, 111], [50, 112], [8, 113], [85, 114], [68, 115], [87, 116], [102, 117], + [77, 118], [62, 119], [70, 120], [86, 121], [13, 122], [101, 123], [69, 124], [37, 125], + [48, 126], [78, 127], [40, 128], [26, 129], [7, 130], [80, 131], [21, 132], [81, 133], + [62, 134], [97, 135], [71, 136], [123, 137], [78, 138], [16, 139], [5, 140], [10, 141], + [138, 142], [21, 143], [15, 144], [91, 145], [0, 146], [65, 147], [64, 148], [28, 149], + [86, 150], [28, 151], [111, 152], [140, 153], [138, 154], [77, 155], [145, 156], [50, 157], + [87, 158], [96, 159], [105, 160], [59, 161], [1, 162], [11, 163], [121, 164], [48, 165], + [119, 166], [133, 167], [26, 168], [92, 169], [63, 170], [158, 171], [164, 172], [115, 173], + [66, 174], [123, 175], [33, 176], [76, 177], [119, 178], [114, 179], [124, 180], [164, 181], + [85, 182], [143, 183], [110, 184], [53, 185], [120, 186], [78, 187], [131, 188], [185, 189], + [69, 190], [168, 191], [51, 192], [89, 193], [159, 194], [176, 195], [13, 196], [51, 197], + [6, 198], [28, 199], [46, 200], [105, 201], [167, 202], [148, 203], [19, 204], [204, 205], + [6, 206], [151, 207], [44, 208], [54, 209], [184, 210], [176, 211], [173, 212], [200, 213], + [203, 214], [106, 215], [87, 216], [1, 217], [173, 218], [103, 219], [160, 220], [118, 221], + [50, 222], [152, 223], [25, 224], [9, 225], [64, 226], [6, 227], [61, 228], [144, 229], + [212, 230], [166, 231], [30, 232], [196, 233], [215, 234], [109, 235], [183, 236], + [13, 237], [183, 238], [18, 239], [149, 240], [189, 241], [149, 242], [157, 243], + [116, 244], [99, 245], [30, 246], [56, 247], [239, 248], [239, 249], [57, 250], [31, 251], + [189, 252], [101, 253], [101, 254], [110, 255], [1, 256], [113, 257], [161, 258], [25, 259], + [44, 260], [194, 261], [137, 262], [218, 263], [183, 264], [228, 265], [153, 266], + [136, 267], [201, 268], [265, 269], [116, 270], [236, 271], [32, 272], [70, 273], + [104, 274], [82, 275], [198, 276], [44, 277], [262, 278], [269, 279], [26, 280], [91, 281], + [180, 282], [157, 283], [36, 284], [215, 285], [183, 286], [1, 287], [39, 288], [164, 289], + [110, 290], [266, 291], [208, 292], [258, 293], [68, 294], [1, 295], [100, 296], [16, 297], + [107, 298], [135, 299], [55, 300], [226, 301], [155, 302], [68, 303], [32, 304], [149, 305], + [217, 306], [186, 307], [69, 308], [244, 309], [14, 310], [216, 311], [211, 312], + [232, 313], [148, 314], [85, 315], [91, 316], [168, 317], [90, 318], [228, 319], [216, 320], + [51, 321], [31, 322], [230, 323], [160, 324], [200, 325], [94, 326], [282, 327], [162, 328], + [130, 329], [87, 330], [29, 331], [295, 332], [32, 333], [136, 334], [219, 335], [218, 336], + [25, 337], [233, 338], [55, 339], [130, 340], [319, 341], [165, 342], [255, 343], [15, 344], + [342, 345], [74, 346], [172, 347], [28, 348], [255, 349], [47, 350], [193, 351], [19, 352], + [303, 353], [205, 354], [174, 355], [172, 356], [260, 357], [243, 358], [186, 359], + [181, 360], [51, 361], [34, 362], [31, 363], [283, 364], [283, 365], [122, 366], [137, 367], + [225, 368], [296, 369], [346, 370], [235, 371], [278, 372], [116, 373], [31, 374], + [248, 375], [89, 376], [20, 377], [287, 378], [222, 379], [33, 380], [3, 381], [140, 382], + [185, 383], [255, 384], [241, 385], [164, 386], [185, 387], [208, 388], [347, 389], + [235, 390], [157, 391], [88, 392], [138, 393], [163, 394], [69, 395], [241, 396], + [307, 397], [271, 398], [248, 399], [346, 400], [265, 401], [90, 402], [249, 403], + [43, 404], [10, 405], [159, 406], [383, 407], [174, 408], [292, 409], [288, 410], + [149, 411], [244, 412], [174, 413], [201, 414], [287, 415], [94, 416], [102, 417], + [123, 418], [10, 419], [332, 420], [192, 421], [377, 422], [136, 423], [119, 424], + [187, 425], [128, 426], [413, 427], [3, 428], [255, 429], [410, 430], [303, 431], + [424, 432], [311, 433], [246, 434], [366, 435], [378, 436], [360, 437], [120, 438], + [90, 439], [353, 440], [126, 441], [78, 442], [23, 443], [115, 444], [6, 445], [359, 446], + [338, 447], [180, 448], [71, 449], [190, 450], [128, 451], [408, 452], [341, 453], + [426, 454], [14, 455], [455, 456], [411, 457], [107, 458], [450, 459], [351, 460], + [235, 461], [422, 462], [316, 463], [272, 464], [204, 465], [102, 466], [145, 467], + [20, 468], [326, 469], [186, 470], [266, 471], [127, 472], [144, 473], [112, 474], + [151, 475], [200, 476], [185, 477], [291, 478], [438, 479], [422, 480], [377, 481], + [261, 482], [437, 483], [204, 484], [324, 485], [402, 486], [106, 487], [268, 488], + [237, 489], [49, 490], [253, 491], [256, 492], [8, 493], [115, 494], [46, 495], [101, 496], + [325, 497], [90, 498], [146, 499], [252, 500], [255, 501], [277, 502], [129, 503], + [339, 504], [6, 505], [462, 506], [363, 507], [421, 508], [7, 509], [279, 510], [361, 511], + [35, 512], [112, 513], [113, 514], [194, 515], [128, 516], [65, 517], [26, 518], [305, 519], + [97, 520], [352, 521], [283, 522], [4, 523], [497, 524], [385, 525], [212, 526], [76, 527], + [92, 528], [194, 529], [344, 530], [510, 531], [461, 532], [89, 533], [228, 534], [97, 535], + [194, 536], [446, 537], [100, 538], [120, 539], [257, 540], [46, 541], [230, 542], + [357, 543], [365, 544], [265, 545], [123, 546], [290, 547], [100, 548], [194, 549], + [134, 550], [538, 551], [114, 552], [52, 553], [251, 554], [236, 555], [416, 556], + [264, 557], [461, 558], [14, 559], [376, 560], [254, 561], [422, 562], [233, 563], + [409, 564], [14, 565], [190, 566], [151, 567], [543, 568], [516, 569], [369, 570], + [432, 571], [343, 572], [341, 573], [531, 574], [77, 575], [394, 576], [471, 577], + [293, 578], [428, 579], [360, 580], [524, 581], [471, 582], [63, 583], [556, 584], + [254, 585], [583, 586], [491, 587], [460, 588], [250, 589], [329, 590], [504, 591], + [414, 592], [353, 593], [172, 594], [582, 595], [474, 596], [19, 597], [327, 598], + [464, 599], [39, 600], [278, 601], [234, 602], [131, 603], [569, 604], [466, 605], + [354, 606], [160, 607], [466, 608], [283, 609], [39, 610], [321, 611], [440, 612], + [280, 613], [142, 614], [9, 615], [411, 616], [519, 617], [317, 618], [278, 619], + [412, 620], [352, 621], [96, 622], [540, 623], [1, 624], [370, 625], [274, 626], [277, 627], + [30, 628], [79, 629], [134, 630], [435, 631], [21, 632], [437, 633], [285, 634], [461, 635], + [122, 636], [137, 637], [550, 638], [399, 639], [490, 640], [405, 641], [358, 642], + [205, 643], [352, 644], [544, 645], [319, 646], [412, 647], [554, 648], [561, 649], + [100, 650], [361, 651], [130, 652], [151, 653], [547, 654], [543, 655], [230, 656], + [34, 657], [240, 658], [533, 659], [220, 660], [551, 661], [635, 662], [298, 663], + [510, 664], [32, 665], [56, 666], [271, 667], [386, 668], [328, 669], [511, 670], + [648, 671], [213, 672], [640, 673], [620, 674], [292, 675], [612, 676], [231, 677], + [519, 678], [218, 679], [158, 680], [284, 681], [149, 682], [180, 683], [465, 684], + [101, 685], [97, 686], [592, 687], [577, 688], [501, 689], [130, 690], [574, 691], + [483, 692], [617, 693], [461, 694], [308, 695], [614, 696], [90, 697], [362, 698], + [313, 699], [301, 700], [562, 701], [41, 702], [627, 703], [408, 704], [476, 705], + [161, 706], [282, 707], [481, 708], [209, 709], [576, 710], [437, 711], [10, 712], + [548, 713], [256, 714], [498, 715], [129, 716], [664, 717], [70, 718], [185, 719], + [629, 720], [108, 721], [360, 722], [503, 723], [105, 724], [213, 725], [177, 726], + [46, 727], [104, 728], [398, 729], [209, 730], [89, 731], [499, 732], [368, 733], + [680, 734], [362, 735], [534, 736], [443, 737], [562, 738], [74, 739], [353, 740], + [165, 741], [108, 742], [438, 743], [131, 744], [140, 745], [37, 746], [28, 747], + [698, 748], [523, 749], [113, 750], [430, 751], [695, 752], [670, 753], [546, 754], + [366, 755], [369, 756], [602, 757], [415, 758], [291, 759], [352, 760], [560, 761], + [569, 762], [681, 763], [55, 764], [381, 765], [324, 766], [740, 767], [308, 768], + [728, 769], [374, 770], [118, 771], [97, 772], [646, 773], [6, 774], [626, 775], [444, 776], + [252, 777], [391, 778], [503, 779], [760, 780], [451, 781], [728, 782], [553, 783], + [410, 784], [487, 785], [343, 786], [350, 787], [579, 788], [3, 789], [706, 790], + [213, 791], [212, 792], [792, 793], [99, 794], [534, 795], [63, 796], [167, 797], + [109, 798], [692, 799], [597, 800], [742, 801], [407, 802], [256, 803], [442, 804], + [587, 805], [313, 806], [652, 807], [602, 808], [665, 809], [330, 810], [508, 811], + [683, 812], [598, 813], [661, 814], [709, 815], [594, 816], [337, 817], [219, 818], + [113, 819], [306, 820], [651, 821], [352, 822], [742, 823], [37, 824], [464, 825], + [452, 826], [165, 827], [774, 828], [17, 829], [280, 830], [511, 831], [542, 832], + [439, 833], [581, 834], [687, 835], [758, 836], [618, 837], [378, 838], [697, 839], + [769, 840], [702, 841], [606, 842], [105, 843], [663, 844], [157, 845], [441, 846], + [348, 847], [676, 848], [775, 849], [446, 850], [722, 851], [572, 852], [191, 853], + [765, 854], [710, 855], [569, 856], [134, 857], [596, 858], [304, 859], [20, 860], + [812, 861], [606, 862], [689, 863], [402, 864], [275, 865], [367, 866], [638, 867], + [618, 868], [231, 869], [367, 870], [255, 871], [740, 872], [232, 873], [571, 874], + [668, 875], [72, 876], [483, 877], [599, 878], [631, 879], [420, 880], [352, 881], + [289, 882], [720, 883], [556, 884], [430, 885], [410, 886], [728, 887], [412, 888], + [682, 889], [839, 890], [59, 891], [233, 892], [272, 893], [688, 894], [431, 895], + [310, 896], [407, 897], [567, 898], [743, 899], [811, 900], [808, 901], [246, 902], + [236, 903], [895, 904], [657, 905], [393, 906], [143, 907], [442, 908], [898, 909], + [72, 910], [282, 911], [901, 912], [624, 913], [697, 914], [484, 915], [582, 916], [4, 917], + [186, 918], [426, 919], [753, 920], [513, 921], [504, 922], [821, 923], [549, 924], + [415, 925], [634, 926], [505, 927], [590, 928], [866, 929], [267, 930], [236, 931], + [343, 932], [693, 933], [116, 934], [543, 935], [463, 936], [880, 937], [126, 938], + [832, 939], [205, 940], [33, 941], [284, 942], [941, 943], [940, 944], [943, 945], + [784, 946], [785, 947], [498, 948], [898, 949], [715, 950], [238, 951], [389, 952], + [951, 953], [511, 954], [767, 955], [332, 956], [300, 957], [298, 958], [317, 959], + [221, 960], [253, 961], [438, 962], [751, 963], [492, 964], [384, 965], [274, 966], + [820, 967], [376, 968], [159, 969], [766, 970], [909, 971], [669, 972], [8, 973], + [957, 974], [539, 975], [844, 976], [470, 977], [80, 978], [641, 979], [172, 980], + [962, 981], [756, 982], [195, 983], [131, 984], [216, 985], [503, 986], [330, 987], + [863, 988], [446, 989], [673, 990], [760, 991], [871, 992], [903, 993], [47, 994], + [810, 995], [736, 996], [749, 997], [951, 998], [348, 999], [741, 1000], [448, 1001], + [809, 1002], [704, 1003], [702, 1004], [113, 1005], [392, 1006], [216, 1007], [58, 1008], + [348, 1009], [170, 1010], [695, 1011], [168, 1012], [752, 1013], [168, 1014], [376, 1015], + [856, 1016], [302, 1017], [278, 1018], [554, 1019], [844, 1020], [368, 1021], [555, 1022], + [283, 1023], [220, 1024], [907, 1025], [356, 1026], [415, 1027], [977, 1028], [433, 1029], + [741, 1030], [702, 1031], [202, 1032], [420, 1033], [773, 1034], [929, 1035], [1020, 1036], + [752, 1037], [846, 1038], [909, 1039], [137, 1040], [752, 1041], [728, 1042], [295, 1043], + [998, 1044], [52, 1045], [825, 1046], [727, 1047], [871, 1048], [941, 1049], [342, 1050], + [579, 1051], [424, 1052], [756, 1053], [50, 1054], [587, 1055], [447, 1056], [1042, 1057], + [171, 1058], [322, 1059], [1049, 1060], [189, 1061], [384, 1062], [403, 1063], [468, 1064], + [666, 1065], [282, 1066], [271, 1067], [407, 1068], [323, 1069], [52, 1070], [571, 1071], + [46, 1072], [412, 1073], [616, 1074], [417, 1075], [1042, 1076], [657, 1077], [940, 1078], + [498, 1079], [597, 1080], [95, 1081], [12, 1082], [541, 1083], [519, 1084], [463, 1085], + [848, 1086], [1000, 1087], [788, 1088], [337, 1089], [1001, 1090], [267, 1091], [378, 1092], + [234, 1093], [907, 1094], [826, 1095], [31, 1096], [188, 1097], [502, 1098], [826, 1099], + [948, 1100], [879, 1101], [388, 1102], [34, 1103], [461, 1104], [568, 1105], [79, 1106], + [319, 1107], [364, 1108], [190, 1109], [605, 1110], [717, 1111], [622, 1112], [385, 1113], + [25, 1114], [835, 1115], [1033, 1116], [1085, 1117], [240, 1118], [199, 1119], [693, 1120], + [68, 1121], [478, 1122], [95, 1123], [842, 1124], [1109, 1125], [678, 1126], [104, 1127], + [918, 1128], [414, 1129], [768, 1130], [421, 1131], [825, 1132], [636, 1133], [290, 1134], + [1083, 1135], [473, 1136], [616, 1137], [1094, 1138], [28, 1139], [137, 1140], [590, 1141], + [654, 1142], [1140, 1143], [789, 1144], [670, 1145], [475, 1146], [176, 1147], [27, 1148], + [1106, 1149], [430, 1150], [192, 1151], [869, 1152], [546, 1153], [955, 1154], [493, 1155], + [643, 1156], [663, 1157], [702, 1158], [823, 1159], [1022, 1160], [228, 1161], [578, 1162], + [655, 1163], [611, 1164], [650, 1165], [1093, 1166], [1052, 1167], [966, 1168], + [1095, 1169], [93, 1170], [632, 1171], [875, 1172], [254, 1173], [629, 1174], [55, 1175], + [1134, 1176], [765, 1177], [210, 1178], [388, 1179], [323, 1180], [479, 1181], [160, 1182], + [1174, 1183], [489, 1184], [62, 1185], [875, 1186], [584, 1187], [56, 1188], [1175, 1189], + [592, 1190], [669, 1191], [330, 1192], [876, 1193], [134, 1194], [43, 1195], [1035, 1196], + [760, 1197], [680, 1198], [367, 1199], [409, 1200], [339, 1201], [772, 1202], [1120, 1203], + [347, 1204], [426, 1205], [384, 1206], [1079, 1207], [454, 1208], [313, 1209], [245, 1210], + [61, 1211], [874, 1212], [885, 1213], [702, 1214], [327, 1215], [452, 1216], [1160, 1217], + [1173, 1218], [872, 1219], [905, 1220], [752, 1221], [918, 1222], [624, 1223], [1023, 1224], + [288, 1225], [479, 1226], [982, 1227], [1103, 1228], [1113, 1229], [695, 1230], [760, 1231], + [789, 1232], [592, 1233], [902, 1234], [1164, 1235], [113, 1236], [1098, 1237], [229, 1238], + [99, 1239], [697, 1240], [320, 1241], [464, 1242], [727, 1243], [761, 1244], [307, 1245], + [1215, 1246], [990, 1247], [859, 1248], [598, 1249], [998, 1250], [156, 1251], [489, 1252], + [815, 1253], [1003, 1254], [535, 1255], [1008, 1256], [246, 1257], [808, 1258], [569, 1259], + [148, 1260], [326, 1261], [40, 1262], [68, 1263], [880, 1264], [391, 1265], [189, 1266], + [1035, 1267], [193, 1268], [338, 1269], [77, 1270], [496, 1271], [322, 1272], [1050, 1273], + [801, 1274], [1211, 1275], [134, 1276], [968, 1277], [296, 1278], [930, 1279], [657, 1280], + [890, 1281], [85, 1282], [1007, 1283], [1194, 1284], [80, 1285], [1191, 1286], [178, 1287], + [1162, 1288], [289, 1289], [1099, 1290], [666, 1291], [291, 1292], [435, 1293], [6, 1294], + [1060, 1295], [219, 1296], [1216, 1297], [1282, 1298], [636, 1299], [960, 1300], + [558, 1301], [885, 1302], [603, 1303], [1261, 1304], [728, 1305], [915, 1306], [818, 1307], + [943, 1308], [260, 1309], [1004, 1310], [325, 1311], [875, 1312]])) diff --git a/Week_03/id_3/bfs/LeetCode_310_3_v3.py b/Week_03/id_3/bfs/LeetCode_310_3_v3.py new file mode 100644 index 00000000..3101f8c4 --- /dev/null +++ b/Week_03/id_3/bfs/LeetCode_310_3_v3.py @@ -0,0 +1,227 @@ +""" +寻找最小高度的根节点,从每一个节点然后向下遍历,最后比较最小值。这个思路是n^2的时间复杂度,无法通过测试。 +从叶子节点反向bfs,找到所有叶子节点最后的根节点,反倒合理的方案。 O(n) +如果 bfs 中出现 一个节点的边除去已经迭代过的子节点外,存在多余一个的边,那么说明改节点不应该继续进行迭代 + +这个有点儿像是拓扑排序,从叶子节点向根节点推进,如果一个叶子节点的父节点还有除该叶子节点以外的节点, +则说明还有其他高度更高的子树没有迭代上来,需要继续等待. + +如此就可以找到整个图最平衡的1-2个节点 + +v3 尝试使用拓扑排序的入度值得方案 +""" + + +class Solution: + def findMinHeightTrees(self, n, edges): + if n == 0: + return [] + if n == 1: + return [0] + + graph = [[] for _ in range(n)] + count_graph = [0 for _ in range(n)] + + for n1, n2 in edges: + graph[n1].append(n2) + graph[n2].append(n1) + count_graph[n1] += 1 + count_graph[n2] += 1 + + queue = [] + for i, v in enumerate(count_graph): + if v == 1: + queue.append(i) + + while queue: + _queue = [] + for i in queue: + for sn in graph[i]: + count_graph[sn] -= 1 + if count_graph[sn] == 1: + _queue.append(sn) + if not _queue: + return queue + queue = _queue + + +s = Solution() +print(s.findMinHeightTrees(1313, [[0, 1], [0, 2], [0, 3], [3, 4], [0, 5], [3, 6], [3, 7], [6, 8], [3, 9], [9, 10], [9, 11], + [10, 12], [3, 13], [2, 14], [5, 15], [1, 16], [5, 17], [15, 18], [17, 19], [12, 20], + [20, 21], [21, 22], [2, 23], [12, 24], [13, 25], [23, 26], [6, 27], [14, 28], [7, 29], + [14, 30], [28, 31], [3, 32], [20, 33], [6, 34], [28, 35], [14, 36], [12, 37], [25, 38], + [28, 39], [0, 40], [11, 41], [19, 42], [41, 43], [24, 44], [43, 45], [14, 46], [36, 47], + [26, 48], [16, 49], [42, 50], [43, 51], [11, 52], [7, 53], [50, 54], [17, 55], [9, 56], + [0, 57], [16, 58], [26, 59], [32, 60], [53, 61], [30, 62], [40, 63], [63, 64], [45, 65], + [13, 66], [24, 67], [42, 68], [2, 69], [63, 70], [39, 71], [34, 72], [20, 73], [20, 74], + [63, 75], [12, 76], [57, 77], [51, 78], [17, 79], [24, 80], [22, 81], [76, 82], [4, 83], + [16, 84], [75, 85], [21, 86], [21, 87], [8, 88], [28, 89], [85, 90], [31, 91], [53, 92], + [57, 93], [45, 94], [67, 95], [87, 96], [10, 97], [95, 98], [0, 99], [46, 100], [39, 101], + [47, 102], [101, 103], [72, 104], [2, 105], [3, 106], [78, 107], [32, 108], [23, 109], + [73, 110], [102, 111], [50, 112], [8, 113], [85, 114], [68, 115], [87, 116], [102, 117], + [77, 118], [62, 119], [70, 120], [86, 121], [13, 122], [101, 123], [69, 124], [37, 125], + [48, 126], [78, 127], [40, 128], [26, 129], [7, 130], [80, 131], [21, 132], [81, 133], + [62, 134], [97, 135], [71, 136], [123, 137], [78, 138], [16, 139], [5, 140], [10, 141], + [138, 142], [21, 143], [15, 144], [91, 145], [0, 146], [65, 147], [64, 148], [28, 149], + [86, 150], [28, 151], [111, 152], [140, 153], [138, 154], [77, 155], [145, 156], [50, 157], + [87, 158], [96, 159], [105, 160], [59, 161], [1, 162], [11, 163], [121, 164], [48, 165], + [119, 166], [133, 167], [26, 168], [92, 169], [63, 170], [158, 171], [164, 172], [115, 173], + [66, 174], [123, 175], [33, 176], [76, 177], [119, 178], [114, 179], [124, 180], [164, 181], + [85, 182], [143, 183], [110, 184], [53, 185], [120, 186], [78, 187], [131, 188], [185, 189], + [69, 190], [168, 191], [51, 192], [89, 193], [159, 194], [176, 195], [13, 196], [51, 197], + [6, 198], [28, 199], [46, 200], [105, 201], [167, 202], [148, 203], [19, 204], [204, 205], + [6, 206], [151, 207], [44, 208], [54, 209], [184, 210], [176, 211], [173, 212], [200, 213], + [203, 214], [106, 215], [87, 216], [1, 217], [173, 218], [103, 219], [160, 220], [118, 221], + [50, 222], [152, 223], [25, 224], [9, 225], [64, 226], [6, 227], [61, 228], [144, 229], + [212, 230], [166, 231], [30, 232], [196, 233], [215, 234], [109, 235], [183, 236], + [13, 237], [183, 238], [18, 239], [149, 240], [189, 241], [149, 242], [157, 243], + [116, 244], [99, 245], [30, 246], [56, 247], [239, 248], [239, 249], [57, 250], [31, 251], + [189, 252], [101, 253], [101, 254], [110, 255], [1, 256], [113, 257], [161, 258], [25, 259], + [44, 260], [194, 261], [137, 262], [218, 263], [183, 264], [228, 265], [153, 266], + [136, 267], [201, 268], [265, 269], [116, 270], [236, 271], [32, 272], [70, 273], + [104, 274], [82, 275], [198, 276], [44, 277], [262, 278], [269, 279], [26, 280], [91, 281], + [180, 282], [157, 283], [36, 284], [215, 285], [183, 286], [1, 287], [39, 288], [164, 289], + [110, 290], [266, 291], [208, 292], [258, 293], [68, 294], [1, 295], [100, 296], [16, 297], + [107, 298], [135, 299], [55, 300], [226, 301], [155, 302], [68, 303], [32, 304], [149, 305], + [217, 306], [186, 307], [69, 308], [244, 309], [14, 310], [216, 311], [211, 312], + [232, 313], [148, 314], [85, 315], [91, 316], [168, 317], [90, 318], [228, 319], [216, 320], + [51, 321], [31, 322], [230, 323], [160, 324], [200, 325], [94, 326], [282, 327], [162, 328], + [130, 329], [87, 330], [29, 331], [295, 332], [32, 333], [136, 334], [219, 335], [218, 336], + [25, 337], [233, 338], [55, 339], [130, 340], [319, 341], [165, 342], [255, 343], [15, 344], + [342, 345], [74, 346], [172, 347], [28, 348], [255, 349], [47, 350], [193, 351], [19, 352], + [303, 353], [205, 354], [174, 355], [172, 356], [260, 357], [243, 358], [186, 359], + [181, 360], [51, 361], [34, 362], [31, 363], [283, 364], [283, 365], [122, 366], [137, 367], + [225, 368], [296, 369], [346, 370], [235, 371], [278, 372], [116, 373], [31, 374], + [248, 375], [89, 376], [20, 377], [287, 378], [222, 379], [33, 380], [3, 381], [140, 382], + [185, 383], [255, 384], [241, 385], [164, 386], [185, 387], [208, 388], [347, 389], + [235, 390], [157, 391], [88, 392], [138, 393], [163, 394], [69, 395], [241, 396], + [307, 397], [271, 398], [248, 399], [346, 400], [265, 401], [90, 402], [249, 403], + [43, 404], [10, 405], [159, 406], [383, 407], [174, 408], [292, 409], [288, 410], + [149, 411], [244, 412], [174, 413], [201, 414], [287, 415], [94, 416], [102, 417], + [123, 418], [10, 419], [332, 420], [192, 421], [377, 422], [136, 423], [119, 424], + [187, 425], [128, 426], [413, 427], [3, 428], [255, 429], [410, 430], [303, 431], + [424, 432], [311, 433], [246, 434], [366, 435], [378, 436], [360, 437], [120, 438], + [90, 439], [353, 440], [126, 441], [78, 442], [23, 443], [115, 444], [6, 445], [359, 446], + [338, 447], [180, 448], [71, 449], [190, 450], [128, 451], [408, 452], [341, 453], + [426, 454], [14, 455], [455, 456], [411, 457], [107, 458], [450, 459], [351, 460], + [235, 461], [422, 462], [316, 463], [272, 464], [204, 465], [102, 466], [145, 467], + [20, 468], [326, 469], [186, 470], [266, 471], [127, 472], [144, 473], [112, 474], + [151, 475], [200, 476], [185, 477], [291, 478], [438, 479], [422, 480], [377, 481], + [261, 482], [437, 483], [204, 484], [324, 485], [402, 486], [106, 487], [268, 488], + [237, 489], [49, 490], [253, 491], [256, 492], [8, 493], [115, 494], [46, 495], [101, 496], + [325, 497], [90, 498], [146, 499], [252, 500], [255, 501], [277, 502], [129, 503], + [339, 504], [6, 505], [462, 506], [363, 507], [421, 508], [7, 509], [279, 510], [361, 511], + [35, 512], [112, 513], [113, 514], [194, 515], [128, 516], [65, 517], [26, 518], [305, 519], + [97, 520], [352, 521], [283, 522], [4, 523], [497, 524], [385, 525], [212, 526], [76, 527], + [92, 528], [194, 529], [344, 530], [510, 531], [461, 532], [89, 533], [228, 534], [97, 535], + [194, 536], [446, 537], [100, 538], [120, 539], [257, 540], [46, 541], [230, 542], + [357, 543], [365, 544], [265, 545], [123, 546], [290, 547], [100, 548], [194, 549], + [134, 550], [538, 551], [114, 552], [52, 553], [251, 554], [236, 555], [416, 556], + [264, 557], [461, 558], [14, 559], [376, 560], [254, 561], [422, 562], [233, 563], + [409, 564], [14, 565], [190, 566], [151, 567], [543, 568], [516, 569], [369, 570], + [432, 571], [343, 572], [341, 573], [531, 574], [77, 575], [394, 576], [471, 577], + [293, 578], [428, 579], [360, 580], [524, 581], [471, 582], [63, 583], [556, 584], + [254, 585], [583, 586], [491, 587], [460, 588], [250, 589], [329, 590], [504, 591], + [414, 592], [353, 593], [172, 594], [582, 595], [474, 596], [19, 597], [327, 598], + [464, 599], [39, 600], [278, 601], [234, 602], [131, 603], [569, 604], [466, 605], + [354, 606], [160, 607], [466, 608], [283, 609], [39, 610], [321, 611], [440, 612], + [280, 613], [142, 614], [9, 615], [411, 616], [519, 617], [317, 618], [278, 619], + [412, 620], [352, 621], [96, 622], [540, 623], [1, 624], [370, 625], [274, 626], [277, 627], + [30, 628], [79, 629], [134, 630], [435, 631], [21, 632], [437, 633], [285, 634], [461, 635], + [122, 636], [137, 637], [550, 638], [399, 639], [490, 640], [405, 641], [358, 642], + [205, 643], [352, 644], [544, 645], [319, 646], [412, 647], [554, 648], [561, 649], + [100, 650], [361, 651], [130, 652], [151, 653], [547, 654], [543, 655], [230, 656], + [34, 657], [240, 658], [533, 659], [220, 660], [551, 661], [635, 662], [298, 663], + [510, 664], [32, 665], [56, 666], [271, 667], [386, 668], [328, 669], [511, 670], + [648, 671], [213, 672], [640, 673], [620, 674], [292, 675], [612, 676], [231, 677], + [519, 678], [218, 679], [158, 680], [284, 681], [149, 682], [180, 683], [465, 684], + [101, 685], [97, 686], [592, 687], [577, 688], [501, 689], [130, 690], [574, 691], + [483, 692], [617, 693], [461, 694], [308, 695], [614, 696], [90, 697], [362, 698], + [313, 699], [301, 700], [562, 701], [41, 702], [627, 703], [408, 704], [476, 705], + [161, 706], [282, 707], [481, 708], [209, 709], [576, 710], [437, 711], [10, 712], + [548, 713], [256, 714], [498, 715], [129, 716], [664, 717], [70, 718], [185, 719], + [629, 720], [108, 721], [360, 722], [503, 723], [105, 724], [213, 725], [177, 726], + [46, 727], [104, 728], [398, 729], [209, 730], [89, 731], [499, 732], [368, 733], + [680, 734], [362, 735], [534, 736], [443, 737], [562, 738], [74, 739], [353, 740], + [165, 741], [108, 742], [438, 743], [131, 744], [140, 745], [37, 746], [28, 747], + [698, 748], [523, 749], [113, 750], [430, 751], [695, 752], [670, 753], [546, 754], + [366, 755], [369, 756], [602, 757], [415, 758], [291, 759], [352, 760], [560, 761], + [569, 762], [681, 763], [55, 764], [381, 765], [324, 766], [740, 767], [308, 768], + [728, 769], [374, 770], [118, 771], [97, 772], [646, 773], [6, 774], [626, 775], [444, 776], + [252, 777], [391, 778], [503, 779], [760, 780], [451, 781], [728, 782], [553, 783], + [410, 784], [487, 785], [343, 786], [350, 787], [579, 788], [3, 789], [706, 790], + [213, 791], [212, 792], [792, 793], [99, 794], [534, 795], [63, 796], [167, 797], + [109, 798], [692, 799], [597, 800], [742, 801], [407, 802], [256, 803], [442, 804], + [587, 805], [313, 806], [652, 807], [602, 808], [665, 809], [330, 810], [508, 811], + [683, 812], [598, 813], [661, 814], [709, 815], [594, 816], [337, 817], [219, 818], + [113, 819], [306, 820], [651, 821], [352, 822], [742, 823], [37, 824], [464, 825], + [452, 826], [165, 827], [774, 828], [17, 829], [280, 830], [511, 831], [542, 832], + [439, 833], [581, 834], [687, 835], [758, 836], [618, 837], [378, 838], [697, 839], + [769, 840], [702, 841], [606, 842], [105, 843], [663, 844], [157, 845], [441, 846], + [348, 847], [676, 848], [775, 849], [446, 850], [722, 851], [572, 852], [191, 853], + [765, 854], [710, 855], [569, 856], [134, 857], [596, 858], [304, 859], [20, 860], + [812, 861], [606, 862], [689, 863], [402, 864], [275, 865], [367, 866], [638, 867], + [618, 868], [231, 869], [367, 870], [255, 871], [740, 872], [232, 873], [571, 874], + [668, 875], [72, 876], [483, 877], [599, 878], [631, 879], [420, 880], [352, 881], + [289, 882], [720, 883], [556, 884], [430, 885], [410, 886], [728, 887], [412, 888], + [682, 889], [839, 890], [59, 891], [233, 892], [272, 893], [688, 894], [431, 895], + [310, 896], [407, 897], [567, 898], [743, 899], [811, 900], [808, 901], [246, 902], + [236, 903], [895, 904], [657, 905], [393, 906], [143, 907], [442, 908], [898, 909], + [72, 910], [282, 911], [901, 912], [624, 913], [697, 914], [484, 915], [582, 916], [4, 917], + [186, 918], [426, 919], [753, 920], [513, 921], [504, 922], [821, 923], [549, 924], + [415, 925], [634, 926], [505, 927], [590, 928], [866, 929], [267, 930], [236, 931], + [343, 932], [693, 933], [116, 934], [543, 935], [463, 936], [880, 937], [126, 938], + [832, 939], [205, 940], [33, 941], [284, 942], [941, 943], [940, 944], [943, 945], + [784, 946], [785, 947], [498, 948], [898, 949], [715, 950], [238, 951], [389, 952], + [951, 953], [511, 954], [767, 955], [332, 956], [300, 957], [298, 958], [317, 959], + [221, 960], [253, 961], [438, 962], [751, 963], [492, 964], [384, 965], [274, 966], + [820, 967], [376, 968], [159, 969], [766, 970], [909, 971], [669, 972], [8, 973], + [957, 974], [539, 975], [844, 976], [470, 977], [80, 978], [641, 979], [172, 980], + [962, 981], [756, 982], [195, 983], [131, 984], [216, 985], [503, 986], [330, 987], + [863, 988], [446, 989], [673, 990], [760, 991], [871, 992], [903, 993], [47, 994], + [810, 995], [736, 996], [749, 997], [951, 998], [348, 999], [741, 1000], [448, 1001], + [809, 1002], [704, 1003], [702, 1004], [113, 1005], [392, 1006], [216, 1007], [58, 1008], + [348, 1009], [170, 1010], [695, 1011], [168, 1012], [752, 1013], [168, 1014], [376, 1015], + [856, 1016], [302, 1017], [278, 1018], [554, 1019], [844, 1020], [368, 1021], [555, 1022], + [283, 1023], [220, 1024], [907, 1025], [356, 1026], [415, 1027], [977, 1028], [433, 1029], + [741, 1030], [702, 1031], [202, 1032], [420, 1033], [773, 1034], [929, 1035], [1020, 1036], + [752, 1037], [846, 1038], [909, 1039], [137, 1040], [752, 1041], [728, 1042], [295, 1043], + [998, 1044], [52, 1045], [825, 1046], [727, 1047], [871, 1048], [941, 1049], [342, 1050], + [579, 1051], [424, 1052], [756, 1053], [50, 1054], [587, 1055], [447, 1056], [1042, 1057], + [171, 1058], [322, 1059], [1049, 1060], [189, 1061], [384, 1062], [403, 1063], [468, 1064], + [666, 1065], [282, 1066], [271, 1067], [407, 1068], [323, 1069], [52, 1070], [571, 1071], + [46, 1072], [412, 1073], [616, 1074], [417, 1075], [1042, 1076], [657, 1077], [940, 1078], + [498, 1079], [597, 1080], [95, 1081], [12, 1082], [541, 1083], [519, 1084], [463, 1085], + [848, 1086], [1000, 1087], [788, 1088], [337, 1089], [1001, 1090], [267, 1091], [378, 1092], + [234, 1093], [907, 1094], [826, 1095], [31, 1096], [188, 1097], [502, 1098], [826, 1099], + [948, 1100], [879, 1101], [388, 1102], [34, 1103], [461, 1104], [568, 1105], [79, 1106], + [319, 1107], [364, 1108], [190, 1109], [605, 1110], [717, 1111], [622, 1112], [385, 1113], + [25, 1114], [835, 1115], [1033, 1116], [1085, 1117], [240, 1118], [199, 1119], [693, 1120], + [68, 1121], [478, 1122], [95, 1123], [842, 1124], [1109, 1125], [678, 1126], [104, 1127], + [918, 1128], [414, 1129], [768, 1130], [421, 1131], [825, 1132], [636, 1133], [290, 1134], + [1083, 1135], [473, 1136], [616, 1137], [1094, 1138], [28, 1139], [137, 1140], [590, 1141], + [654, 1142], [1140, 1143], [789, 1144], [670, 1145], [475, 1146], [176, 1147], [27, 1148], + [1106, 1149], [430, 1150], [192, 1151], [869, 1152], [546, 1153], [955, 1154], [493, 1155], + [643, 1156], [663, 1157], [702, 1158], [823, 1159], [1022, 1160], [228, 1161], [578, 1162], + [655, 1163], [611, 1164], [650, 1165], [1093, 1166], [1052, 1167], [966, 1168], + [1095, 1169], [93, 1170], [632, 1171], [875, 1172], [254, 1173], [629, 1174], [55, 1175], + [1134, 1176], [765, 1177], [210, 1178], [388, 1179], [323, 1180], [479, 1181], [160, 1182], + [1174, 1183], [489, 1184], [62, 1185], [875, 1186], [584, 1187], [56, 1188], [1175, 1189], + [592, 1190], [669, 1191], [330, 1192], [876, 1193], [134, 1194], [43, 1195], [1035, 1196], + [760, 1197], [680, 1198], [367, 1199], [409, 1200], [339, 1201], [772, 1202], [1120, 1203], + [347, 1204], [426, 1205], [384, 1206], [1079, 1207], [454, 1208], [313, 1209], [245, 1210], + [61, 1211], [874, 1212], [885, 1213], [702, 1214], [327, 1215], [452, 1216], [1160, 1217], + [1173, 1218], [872, 1219], [905, 1220], [752, 1221], [918, 1222], [624, 1223], [1023, 1224], + [288, 1225], [479, 1226], [982, 1227], [1103, 1228], [1113, 1229], [695, 1230], [760, 1231], + [789, 1232], [592, 1233], [902, 1234], [1164, 1235], [113, 1236], [1098, 1237], [229, 1238], + [99, 1239], [697, 1240], [320, 1241], [464, 1242], [727, 1243], [761, 1244], [307, 1245], + [1215, 1246], [990, 1247], [859, 1248], [598, 1249], [998, 1250], [156, 1251], [489, 1252], + [815, 1253], [1003, 1254], [535, 1255], [1008, 1256], [246, 1257], [808, 1258], [569, 1259], + [148, 1260], [326, 1261], [40, 1262], [68, 1263], [880, 1264], [391, 1265], [189, 1266], + [1035, 1267], [193, 1268], [338, 1269], [77, 1270], [496, 1271], [322, 1272], [1050, 1273], + [801, 1274], [1211, 1275], [134, 1276], [968, 1277], [296, 1278], [930, 1279], [657, 1280], + [890, 1281], [85, 1282], [1007, 1283], [1194, 1284], [80, 1285], [1191, 1286], [178, 1287], + [1162, 1288], [289, 1289], [1099, 1290], [666, 1291], [291, 1292], [435, 1293], [6, 1294], + [1060, 1295], [219, 1296], [1216, 1297], [1282, 1298], [636, 1299], [960, 1300], + [558, 1301], [885, 1302], [603, 1303], [1261, 1304], [728, 1305], [915, 1306], [818, 1307], + [943, 1308], [260, 1309], [1004, 1310], [325, 1311], [875, 1312]]))