diff --git a/Week_01/id_3/NOTE.md b/Week_01/id_3/NOTE.md index 107ea7d6..3e485dc6 100644 --- a/Week_01/id_3/NOTE.md +++ b/Week_01/id_3/NOTE.md @@ -1 +1,14 @@ # 学习笔记 + +## 小技巧 +python的数组下标访问比hash快多了 + +l1, l2 = l2, l1 +这个语法不但简单,而且思路其实适用于任何语言。 +两个变量没有顺序要求,我们可以通过预处理的方式,强制变成有先后关系,这就避免了维护一个中间标量的尴尬 + +python的异或实现 bool(n1) != bool(n2) js也可以参考 + + +DP 子问题有最优解 -> 全局最优解 找到最优子结构即可向上递推 +递归 可以遍历所有解,这个是DP做不到的 diff --git a/Week_01/id_3/array/15/LeetCode_15_3_v1.py b/Week_01/id_3/array/15/LeetCode_15_3_v1.py new file mode 100644 index 00000000..39c32709 --- /dev/null +++ b/Week_01/id_3/array/15/LeetCode_15_3_v1.py @@ -0,0 +1,54 @@ +def three_sum(nums): + r = [] + if not nums or len(nums) < 3: + return r + + cache = {} + dset = set() + + new_nums = [] + + for n in nums: + count = 1 + cache.get(n, 0) + cache[n] = count + if n and count <= 2: + new_nums.append(n) + + zero_count = cache.get(0, 0) + if zero_count >= 3: + r.append([0, 0, 0]) + + if zero_count > 0: + new_nums.append(0) + + nums = new_nums + nums.sort() + + length = len(nums) + for i in range(length): + n1 = nums[i] + # n1 >= 0 时说明已经遍历把有效的数据都进行遍历,继续遍历已经发生重复 + if n1 >= 0: + break + for j in range(i+1, length): + n2 = nums[j] + if n1 == 0 and n2 == 0 and cache[0] < 3: + continue + s = -(n1 + n2) + + # 迭代顺序是从小到大的 + # 当-sum(n1,n2)的结果小于n2时 说明已经迭代出现了重复 -sum必然在之前已经迭代过 + if s < n2: + break + + if (s == n1 or s == n2) and cache.get(s, 0) == 1: + continue + + if cache.get(s, 0): + arr = [n1, n2, s] + ds = '%s,%s' % (n1, n2) + if ds not in dset: + dset.add(ds) + r.append(arr) + + return r diff --git a/Week_01/id_3/array/15/LeetCode_15_3_v2.py b/Week_01/id_3/array/15/LeetCode_15_3_v2.py new file mode 100644 index 00000000..0efa111d --- /dev/null +++ b/Week_01/id_3/array/15/LeetCode_15_3_v2.py @@ -0,0 +1,6 @@ +def three_sum(nums): + nums, r = sorted(nums), set() + for i in [i for i in range(len(nums)-2) if i < 1 or nums[i] > nums[i-1]]: + d = {-nums[i]-n: j for j, n in enumerate(nums[i + 1:])} + r.update([(nums[i], n, -nums[i]-n) for j, n in enumerate(nums[i+1:]) if n in d and d[n] > j]) + return list(map(list, r)) diff --git a/Week_01/id_3/array/15/test_15.py b/Week_01/id_3/array/15/test_15.py new file mode 100644 index 00000000..f5d350fa --- /dev/null +++ b/Week_01/id_3/array/15/test_15.py @@ -0,0 +1,24 @@ +import lc_15_v1 +import lc_15_v2 + +f = lc_15_v1.three_sum +# f = lc_15_v2.three_sum + + +def check(nums, r): + _r = f(nums) + print(_r, r, _r == r) + + +check([-1, 0, 1, 2, -1, -4], + [ + [-1, 0, 1], + [-1, -1, 2] + ]) + + +check([0, 0], []) +check([0, 0, 0], [[0, 0, 0]]) + +check([-4, -2, -2, -2, 0, 1, 2, 2, 2, 3, 3, 4, 4, 6, 6], + [[-4, -2, 6], [-4, 0, 4], [-4, 1, 3], [-4, 2, 2], [-2, -2, 4], [-2, 0, 2]]) diff --git a/Week_01/id_3/array/189/LeetCode_189_3_v1.py b/Week_01/id_3/array/189/LeetCode_189_3_v1.py new file mode 100644 index 00000000..2880a713 --- /dev/null +++ b/Week_01/id_3/array/189/LeetCode_189_3_v1.py @@ -0,0 +1,27 @@ +# 最大公约数 +# 每次数组挪动一步,挪动k次,毫无疑问是可以实现的,但是时间复杂度 O(kn) 是无法接受的 +# 如果每次移动的是nums[i]和nums[i+k],很可能无法遍历所有数据,例如len(nums)==9 k==3,此时只会在0,3,6三个下标之间进行移动 +# 根据规律总结 如len(nums)与k的最小公倍数 是每次进行k偏移交换的循环 +# 也就是len(nums)与k的最大公约数gcd会是产生循环迭代的次数。例如len(nums)==9 k==3 gcd==3 下标每次偏移3,3次就会出现循环。 +# 所以需要 len(nums)/gcd 次就可以交换所有的数据 + +import math + + +def rotate(nums, k): + if not nums: + return + + length = len(nums) + k = k % length + + if not k: + return + + gcd = math.gcd(length, k) + + for offset in range(gcd): + tmp = nums[offset] + for i in range(1, int(length/gcd) + 1): + index = (i*k + offset) % length + nums[index], tmp = tmp, nums[index] diff --git a/Week_01/id_3/array/189/LeetCode_189_3_v2.py b/Week_01/id_3/array/189/LeetCode_189_3_v2.py new file mode 100644 index 00000000..a3dedc2e --- /dev/null +++ b/Week_01/id_3/array/189/LeetCode_189_3_v2.py @@ -0,0 +1,24 @@ +# 交换法 +# 1,2,3,4,5,6,7 进行3位置的移动 等价于 list[0:4]+list[0:3] 两段数据的位置交换 +# 位置交换的原地极简方案就是两次反转 [1,2,3,4,5,6,7] 反转0:4-> [4,3,2,1,5,6,7] 反转4:7-> [4,3,2,1,7,6,5] 全部反转-> [5,6,7,1,2,3,4] + + +def rotate(nums, k): + if not nums: + return + + length = len(nums) + if length == 1: + return + + k = k % length + + tail = length - k - 1 + for i in range(int((length-k)/2)): + nums[i], nums[tail-i] = nums[tail-i], nums[i] + + tail = -k + for i in range(int(k/2)): + nums[-i-1], nums[tail+i] = nums[tail+i], nums[-i-1] + + nums.reverse() diff --git a/Week_01/id_3/array/189/test_189.py b/Week_01/id_3/array/189/test_189.py new file mode 100644 index 00000000..83ee5de0 --- /dev/null +++ b/Week_01/id_3/array/189/test_189.py @@ -0,0 +1,24 @@ +import lc_189_v1 +import lc_189_v2 + +# f = lc_189_v1.rotate +f = lc_189_v2.rotate + + +def check(params, k, arr): + _p = list(params) + f(params, k) + print(_p, params == arr) + + +check([1, 2, 3, 4, 5, 6, 7], 3, [5, 6, 7, 1, 2, 3, 4]) +check([1, 2, 3, 4, 5, 6], 3, [4, 5, 6, 1, 2, 3]) +check([1, 2, 3], 7, [3, 1, 2]) +check([-1], 2, [-1]) +check( + [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54], + 45, + [10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 1, 2, 3, 4, 5, 6, 7, 8, 9] +) diff --git a/Week_01/id_3/array/26/LeetCode_26_3_v1.py b/Week_01/id_3/array/26/LeetCode_26_3_v1.py new file mode 100644 index 00000000..0e08b7b4 --- /dev/null +++ b/Week_01/id_3/array/26/LeetCode_26_3_v1.py @@ -0,0 +1,12 @@ +def remove_duplicates(nums): + if not nums: + return 0 + + i = 1 + cur = nums[0] + for n in nums: + if n != cur: + nums[i] = cur = n + i += 1 + + return i diff --git a/Week_01/id_3/array/26/test_26.py b/Week_01/id_3/array/26/test_26.py new file mode 100644 index 00000000..74085dbb --- /dev/null +++ b/Week_01/id_3/array/26/test_26.py @@ -0,0 +1,12 @@ +import lc_26_v1 + +f = lc_26_v1.remove_duplicates + + +def check(params, length, arr): + _p = list(params) + print(_p, f(params) == length and params[:length] == arr) + + +check([], 0, []) +check([1, 1, 2, 3], 3, [1, 2, 3]) diff --git a/Week_01/id_3/array/88/LeetCode_88_3_v1.py b/Week_01/id_3/array/88/LeetCode_88_3_v1.py new file mode 100644 index 00000000..14856118 --- /dev/null +++ b/Week_01/id_3/array/88/LeetCode_88_3_v1.py @@ -0,0 +1,16 @@ +# nums1 m -> m+n 位置是剩余空间 如果按从小到大排序会出现复杂的冲突 +# 而从大到小排列, 最大的元素移动到剩余空间的末端,则可以避免出现冲突 + + +def merge(nums1, m, nums2, n): + tail = m + n + for i in range(tail): + if n == 0: + break + tail -= 1 + if m > 0 and nums1[m-1] > nums2[n-1]: + m -= 1 + nums1[tail] = nums1[m] + else: + n -= 1 + nums1[tail] = nums2[n] diff --git a/Week_01/id_3/array/88/LeetCode_88_3_v2.py b/Week_01/id_3/array/88/LeetCode_88_3_v2.py new file mode 100644 index 00000000..1fe5fd04 --- /dev/null +++ b/Week_01/id_3/array/88/LeetCode_88_3_v2.py @@ -0,0 +1,5 @@ +# 题目并未要求原地排序 所以弄个简单的 + + +def merge(nums1, m, nums2, n): + nums1[:m+n] = sorted(nums1[:m] + nums2[:n]) diff --git a/Week_01/id_3/array/88/test_88.py b/Week_01/id_3/array/88/test_88.py new file mode 100644 index 00000000..6fb6b5fa --- /dev/null +++ b/Week_01/id_3/array/88/test_88.py @@ -0,0 +1,13 @@ +import lc_88_v1 +import lc_88_v2 + +f = lc_88_v1.merge +# f = lc_88_v2.merge + + +def check(nums1, m, nums2, n, r): + f(nums1, m, nums2, n) + print(nums1, nums1 == r) + + +check([1, 2, 3, 0, 0, 0], 3, [2, 5, 6], 3, [1, 2, 2, 3, 5, 6]) diff --git a/Week_01/id_3/bs/441/LeetCode_441_3_v1.py b/Week_01/id_3/bs/441/LeetCode_441_3_v1.py new file mode 100644 index 00000000..3dbe67ad --- /dev/null +++ b/Week_01/id_3/bs/441/LeetCode_441_3_v1.py @@ -0,0 +1,10 @@ +def arrange_coins(n): + if n <= 0: + return 0 + s = 0 + k = 0 + while s <= n: + k += 1 + s += k + + return k - 1 diff --git a/Week_01/id_3/bs/441/LeetCode_441_3_v2.py b/Week_01/id_3/bs/441/LeetCode_441_3_v2.py new file mode 100644 index 00000000..cce7fc27 --- /dev/null +++ b/Week_01/id_3/bs/441/LeetCode_441_3_v2.py @@ -0,0 +1,16 @@ +# 此题超时了 有待用二分优化 + + +def arrange_coins(n): + if n <= 0: + return 0 + k = 1 + + while True: + s = int(((1 + k) * k)/2) + print(s, k) + if s == n: + return k + if s > n: + return k - 1 + k += 1 diff --git a/Week_01/id_3/bs/441/test_441.py b/Week_01/id_3/bs/441/test_441.py new file mode 100644 index 00000000..73393066 --- /dev/null +++ b/Week_01/id_3/bs/441/test_441.py @@ -0,0 +1,15 @@ +import lc_441_v1 +import lc_441_v2 + +# f = lc_441_v1.arrange_coins +f = lc_441_v2.arrange_coins + + +def check(n, r): + _r = f(n) + print(_r, r, _r == r) + + +check(5, 2) +check(8, 3) +check(2146533481, 65521) diff --git a/Week_01/id_3/bs/bs_basis.py b/Week_01/id_3/bs/bs_basis.py new file mode 100644 index 00000000..f4982618 --- /dev/null +++ b/Week_01/id_3/bs/bs_basis.py @@ -0,0 +1,90 @@ +def bs(nums, x): + if not nums: + return -1 + length = len(nums) + low = 0 + high = length - 1 + while low <= high: + mid = low + int((high - low)/2) + v = nums[mid] + if v == x: + return mid + if v > x: + high = mid - 1 + else: + low = mid + 1 + + return -1 + + +def bs_first(nums, x): + if not nums: + return -1 + length = len(nums) + low = 0 + high = length - 1 + while low <= high: + mid = low + int((high - low)/2) + v = nums[mid] + if v >= x: + high = mid - 1 + else: + low = mid + 1 + + if low < length and nums[low] == x: + return low + + return -1 + + +def bs_last(nums, x): + low = 0 + high = len(nums) - 1 + while low <= high: + mid = low + (high - low)//2 + v = nums[mid] + if v > x: + high = mid - 1 + else: + low = mid + 1 + if high >= 0 and nums[high] == x: + return high + return -1 + + +def bs_gte(nums, x): + low = 0 + high = len(nums) - 1 + while low <= high: + mid = low + (high - low)//2 + v = nums[mid] + if v >= x: + high = mid - 1 + else: + low = mid + 1 + + return low + + +# print(bs([8, 11, 19, 23, 27, 33, 45, 55, 67, 98], 19) == 2) +# print(bs([8, 11, 19, 23, 27, 33, 45, 55, 67, 98], 33) == 5) +# print(bs([8, 11, 19, 23, 27, 33, 45, 55, 67, 98], 18) == -1) +# print(bs([8, 8, 11, 11, 19, 23, 27, 33, 45, 55, 67, 98], 19) == 4) +# +# print(bs_first([8, 8, 8, 11, 11, 19, 23, 27, 33, 45, 55, 67, 98], 11) == 3) +# print(bs_first([8, 8, 8, 11, 11, 19, 23, 27, 33, 45, 55, 67, 98], 8) == 0) +# print(bs_first([8, 8, 11, 11, 19, 23, 27, 33, 45, 55, 67, 98], 18) == -1) +# print(bs_first([8, 8, 11, 11, 19, 23, 27, 33, 45, 55, 67, 98], 188) == -1) +# print(bs_first([8, 8, 11, 11, 19, 23, 27, 33, 45, 55, 67, 98], 1) == -1) + +print(bs_last([8, 8, 8, 11, 11, 19, 23, 27, 33, 45, 55, 67, 98], 11) == 4) +print(bs_last([8, 8, 8, 11, 11, 19, 23, 27, 33, 45, 55, 67, 98], 8) == 2) +print(bs_last([8, 8, 11, 11, 19, 23, 27, 33, 45, 55, 67, 98], 18) == -1) +print(bs_last([8, 8, 11, 11, 19, 23, 27, 33, 45, 55, 67, 98], 188) == -1) +print(bs_last([8, 8, 11, 11, 19, 23, 27, 33, 45, 55, 67, 98], 1) == -1) + +# print(bs_gte([8, 8, 11, 11, 19, 23, 27, 33, 45, 55, 67, 98], 17) == 4) +# print(bs_gte([8, 8, 11, 11, 19, 23, 27, 33, 45, 55, 67, 98], 19) == 4) +# print(bs_gte([8, 8, 11, 11, 19, 23, 27, 33, 45, 55, 67, 98], 100) == 12) +# print(bs_gte([8, 8, 11, 11, 19, 23, 27, 33, 45, 55, 67, 98], 8) == 0) +# print(bs_gte([8, 8, 11, 11, 19, 23, 27, 33, 45, 55, 67, 98], 7) == 0) diff --git a/Week_01/id_3/hash/242/LeetCode_242_3_v1.py b/Week_01/id_3/hash/242/LeetCode_242_3_v1.py new file mode 100644 index 00000000..0d654d04 --- /dev/null +++ b/Week_01/id_3/hash/242/LeetCode_242_3_v1.py @@ -0,0 +1,16 @@ +def is_anagram(s, t): + if len(s) != len(t): + return False + + arr = [0] * 26 + m = ord('a') + for c in s: + arr[ord(c) % m] += 1 + + for c in t: + i = ord(c) % m + if arr[i] == 0: + return False + arr[i] -= 1 + + return True diff --git a/Week_01/id_3/hash/242/test_242.py b/Week_01/id_3/hash/242/test_242.py new file mode 100644 index 00000000..5e4b539f --- /dev/null +++ b/Week_01/id_3/hash/242/test_242.py @@ -0,0 +1,6 @@ +import lc_242_v1 + +f = lc_242_v1.is_anagram + +print(f('anagram', 'nagaram')) +print(not f('rat', 'car')) diff --git a/Week_01/id_3/hash/49/LeetCode_49_3_v1.py b/Week_01/id_3/hash/49/LeetCode_49_3_v1.py new file mode 100644 index 00000000..9bbc7ebd --- /dev/null +++ b/Week_01/id_3/hash/49/LeetCode_49_3_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"] + ]) diff --git a/Week_01/id_3/linked/21/LeetCode_21_3_v1.py b/Week_01/id_3/linked/21/LeetCode_21_3_v1.py new file mode 100644 index 00000000..2ec4b375 --- /dev/null +++ b/Week_01/id_3/linked/21/LeetCode_21_3_v1.py @@ -0,0 +1,16 @@ +class ListNode: + def __init__(self, x): + self.val = x + self.next = None + + +def merge(l1, l2): + cur = root = ListNode(0) + while l1 and l2: + if l1.val > l2.val: + l1, l2 = l2, l1 + cur.next = l1 + cur = l1 + l1 = l1.next + cur.next = l1 or l2 + return root.next diff --git a/Week_01/id_3/linked/21/LeetCode_21_3_v2.py b/Week_01/id_3/linked/21/LeetCode_21_3_v2.py new file mode 100644 index 00000000..2236affa --- /dev/null +++ b/Week_01/id_3/linked/21/LeetCode_21_3_v2.py @@ -0,0 +1,11 @@ +# 本代码按python语法进行优化 查看之前得提交可以看到更远古的写法 + + +def merge(l1, l2): + if not l1 or not l2: + return l1 or l2 + + if l1.val > l2.val: + l1, l2 = l2, l1 + l1.next = merge(l1.next, l2) + return l1 diff --git a/Week_01/id_3/linked/21/test_21.py b/Week_01/id_3/linked/21/test_21.py new file mode 100644 index 00000000..76113534 --- /dev/null +++ b/Week_01/id_3/linked/21/test_21.py @@ -0,0 +1,41 @@ +import lc_21_v1 +import lc_21_v2 + +# f = lc_21_v1.merge +f = lc_21_v2.merge + + +class ListNode: + def __init__(self, x): + self.val = x + self.next = None + + +def build(l): + root = None + prev = None + for x in l: + node = ListNode(x) + if prev: + prev.next = node + if not root: + root = node + prev = node + + return root + + +def export(root): + r = [root.val] + while root.next: + root = root.next + r.append(root.val) + print(r) + return r + + +def check(l1, l2, r): + print(export(f(build(l1), build(l2))) == r) + + +check([1, 2, 4], [1, 3, 4], [1, 1, 2, 3, 4, 4]) diff --git a/Week_01/id_3/linked/24/LeetCode_24_3_v1.py b/Week_01/id_3/linked/24/LeetCode_24_3_v1.py new file mode 100644 index 00000000..0dcf7fe8 --- /dev/null +++ b/Week_01/id_3/linked/24/LeetCode_24_3_v1.py @@ -0,0 +1,7 @@ +def swap(head): + if not head or not head.next: + return head + nxt = head.next + head.next = swap(nxt.next) + nxt.next = head + return nxt diff --git a/Week_01/id_3/linked/24/LeetCode_24_3_v2.py b/Week_01/id_3/linked/24/LeetCode_24_3_v2.py new file mode 100644 index 00000000..9b5acaa5 --- /dev/null +++ b/Week_01/id_3/linked/24/LeetCode_24_3_v2.py @@ -0,0 +1,18 @@ +class ListNode: + def __init__(self, x): + self.val = x + self.next = None + + +def swap(head): + if not head or not head.next: + return head + + root = prev = ListNode(0) + while head and head.next: + nxt = head.next + prev.next = nxt + nxt.next, prev, head = head, head, nxt.next + + prev.next = head + return root.next diff --git a/Week_01/id_3/linked/24/test_24.py b/Week_01/id_3/linked/24/test_24.py new file mode 100644 index 00000000..a2f6757d --- /dev/null +++ b/Week_01/id_3/linked/24/test_24.py @@ -0,0 +1,42 @@ +import lc_24_v1 +import lc_24_v2 + +# f = lc_24_v1.swap +f = lc_24_v2.swap + + +class ListNode: + def __init__(self, x): + self.val = x + self.next = None + + +def build(l): + root = None + prev = None + for x in l: + node = ListNode(x) + if prev: + prev.next = node + if not root: + root = node + prev = node + + return root + + +def export(root): + r = [root.val] + while root.next: + root = root.next + r.append(root.val) + return r + + +def check(l, r): + _r = export(f(build(l))) + print(_r, r, _r == r) + + +check([1, 2, 3, 4], [2, 1, 4, 3]) +check([1, 2, 3], [2, 1, 3]) diff --git a/Week_01/id_3/recursion/101/LeetCode_101_3_v1.py b/Week_01/id_3/recursion/101/LeetCode_101_3_v1.py new file mode 100644 index 00000000..5b670cd7 --- /dev/null +++ b/Week_01/id_3/recursion/101/LeetCode_101_3_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/LeetCode_101_3_v2.py b/Week_01/id_3/recursion/101/LeetCode_101_3_v2.py new file mode 100644 index 00000000..19a463bc --- /dev/null +++ b/Week_01/id_3/recursion/101/LeetCode_101_3_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/LeetCode_101_3_v3.py b/Week_01/id_3/recursion/101/LeetCode_101_3_v3.py new file mode 100644 index 00000000..0be05ef4 --- /dev/null +++ b/Week_01/id_3/recursion/101/LeetCode_101_3_v3.py @@ -0,0 +1,28 @@ +""" + 参考答案 略做修改 两颗子树的对称比较,除了比较根节点外,还要比较t1.left是否与t2.right对称, t1.right 是否与t2.left对称 + DFS遍历的时候进行一些变体,使每次将需要对比的两个子树相邻入栈,每次也取出两个节点进行对比,当遇到一次不对称的节点就返回失败。 + 1 + / \ + 2 2 + / \ / \ + 3 4 4 3 +""" + + +def is_symmetric(root): + stack = [root.left, root.right] + while len(stack) > 0: + n1 = stack.pop() + n2 = stack.pop() + if not n1 and not n2: + continue + if bool(n1) != bool(n2): + return False + if n1.val != n2.val: + return False + stack.append(n1.left) + stack.append(n2.right) + stack.append(n1.right) + stack.append(n2.left) + + return True diff --git a/Week_01/id_3/recursion/101/test_101.py b/Week_01/id_3/recursion/101/test_101.py new file mode 100644 index 00000000..bb390fbd --- /dev/null +++ b/Week_01/id_3/recursion/101/test_101.py @@ -0,0 +1,38 @@ +class TreeNode: + def __init__(self, x): + self.val = x + self.left = None + self.right = None + + +def build(nums): + if not nums: + return None + + return build_node(nums, 1) + + +def build_node(nums, i): + if len(nums) < i or nums[i-1] is None: + return None + node = TreeNode(nums[i-1]) + node.left = build_node(nums, 2 * i) + node.right = build_node(nums, 2 * i + 1) + return node + + +import lc_101_v1 +import lc_101_v2 +import lc_101_v3 + +# f = lc_101_v1.is_symmetric +f = lc_101_v2.is_symmetric +# f = lc_101_v3.is_symmetric + + +def check(nums): + print(f(build(nums))) + + +check([1, 2, 2, 3, 4, 4, 3]) +check([1, 2, 2, None, 3, None, 3]) diff --git a/Week_01/id_3/recursion/104/LeetCode_104_3_v1.py b/Week_01/id_3/recursion/104/LeetCode_104_3_v1.py new file mode 100644 index 00000000..17237338 --- /dev/null +++ b/Week_01/id_3/recursion/104/LeetCode_104_3_v1.py @@ -0,0 +1,4 @@ +def max_depth(root): + if not root: + return 0 + return max(max_depth(root.left), max_depth(root.right)) + 1 diff --git a/Week_01/id_3/recursion/104/LeetCode_104_3_v2.py b/Week_01/id_3/recursion/104/LeetCode_104_3_v2.py new file mode 100644 index 00000000..7aac2393 --- /dev/null +++ b/Week_01/id_3/recursion/104/LeetCode_104_3_v2.py @@ -0,0 +1,2 @@ +def max_depth(root): + pass diff --git a/Week_01/id_3/recursion/104/test_104.py b/Week_01/id_3/recursion/104/test_104.py new file mode 100644 index 00000000..ad8861fd --- /dev/null +++ b/Week_01/id_3/recursion/104/test_104.py @@ -0,0 +1,37 @@ +class TreeNode: + def __init__(self, x): + self.val = x + self.left = None + self.right = None + + +def build(nums): + if not nums: + return None + + return build_node(nums, 1) + + +def build_node(nums, i): + if len(nums) < i or nums[i-1] is None: + return None + node = TreeNode(nums[i-1]) + node.left = build_node(nums, 2 * i) + node.right = build_node(nums, 2 * i + 1) + return node + + +import LeetCode_104_3_v1 +import LeetCode_104_3_v2 + +# f = LeetCode_104_3_v1.max_depth +f = LeetCode_104_3_v2.max_depth + + +def check(nums, r): + _r = f(build(nums)) + print(_r, r, _r == r) + + +check([3, 9, 20, None, None, 15, 7], 3) +check([0, 2, 4, 1, None, 3, -1, 5, 1, None, 6, None, 8], 4) diff --git a/Week_01/id_3/recursion/236/LeetCode_236_3_v1.py b/Week_01/id_3/recursion/236/LeetCode_236_3_v1.py new file mode 100644 index 00000000..bc223464 --- /dev/null +++ b/Week_01/id_3/recursion/236/LeetCode_236_3_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) diff --git a/Week_01/id_3/recursion/257/LeetCode_257_3_v1.py b/Week_01/id_3/recursion/257/LeetCode_257_3_v1.py new file mode 100644 index 00000000..c03d75c6 --- /dev/null +++ b/Week_01/id_3/recursion/257/LeetCode_257_3_v1.py @@ -0,0 +1,21 @@ +class Solution: + def binaryTreePaths(self, root): + results = [] + if not root: + return results + path_stack = [] + self.dfs(root, path_stack, results) + return results + + def dfs(self, node, path_stack, results): + path_stack.append(str(node.val)) + if not node.left and not node.right: + results.append('->'.join(path_stack)) + path_stack.pop() + return + if node.left: + self.dfs(node.left, path_stack, results) + if node.right: + self.dfs(node.right, path_stack, results) + + path_stack.pop() diff --git a/Week_01/id_3/recursion/322/LeetCode_322_3_v1.py b/Week_01/id_3/recursion/322/LeetCode_322_3_v1.py new file mode 100644 index 00000000..50449313 --- /dev/null +++ b/Week_01/id_3/recursion/322/LeetCode_322_3_v1.py @@ -0,0 +1,37 @@ +class Solution: + + def coin_change(self, coins, amount): + if amount == 0: + return 0 + _max = amount + 1 + self.max = _max + self.result = _max + self.dp = [0 for i in range(amount)] + coins.sort(reverse=True) + self.dfs(coins, amount, 0, 0) + if self.result == _max: + return -1 + else: + return self.result + + def dfs(self, coins, amount, cur_sum, cur_times): + if cur_times >= self.result: + return + for c in coins: + new_sum = cur_sum + c + if new_sum > amount: + continue + next_times = cur_times + 1 + if new_sum == amount: + self.result = min(self.result, next_times) + return + dp = self.dp + if not dp[new_sum] or dp[new_sum] > next_times: + dp[new_sum] = next_times + self.dfs(coins, amount, new_sum, next_times) + + if len(coins) > 0: + coins = coins[1:] + + +print(Solution().coin_change([186, 419, 83, 408], 6249)) diff --git a/Week_01/id_3/recursion/783/LeetCode_783_3_v1.py b/Week_01/id_3/recursion/783/LeetCode_783_3_v1.py new file mode 100644 index 00000000..40805343 --- /dev/null +++ b/Week_01/id_3/recursion/783/LeetCode_783_3_v1.py @@ -0,0 +1,20 @@ +class Solution: + def minDiffInBST(self, root) -> int: + if not root: + return 0 + stack = [] + node = root + # 题目中有说明取值在 2 - 100 + diff = 99 + last = -100 + while stack or node: + if node: + stack.append(node) + node = node.left + else: + node = stack.pop() + diff = min(diff, node.val - last) + last = node.val + node = node.right + + return diff diff --git a/Week_01/id_3/recursion/783/LeetCode_783_3_v2.py b/Week_01/id_3/recursion/783/LeetCode_783_3_v2.py new file mode 100644 index 00000000..64b79715 --- /dev/null +++ b/Week_01/id_3/recursion/783/LeetCode_783_3_v2.py @@ -0,0 +1,16 @@ +class Solution: + def minDiffInBST(self, root) -> int: + # 取值2-100之间 + self.diff = 100 + self.last = -100 + + def dfs(node): + if not node: + return + dfs(node.left) + self.diff = min(self.diff, node.val-self.last) + self.last = node.val + dfs(node.right) + + dfs(root) + return self.diff diff --git a/Week_01/id_3/recursion/783/LeetCode_783_3_v3.py b/Week_01/id_3/recursion/783/LeetCode_783_3_v3.py new file mode 100644 index 00000000..52a574a9 --- /dev/null +++ b/Week_01/id_3/recursion/783/LeetCode_783_3_v3.py @@ -0,0 +1,25 @@ +class Solution: + def minDiffInBST(self, root) -> int: + # 取值2-100之间 + diff = 100 + last = -100 + stack = [] + node = root + while stack or node: + if node.left: + stack.append(node) + node = node.left + continue + + while stack or node: + diff = min(diff, node.val - last) + last = node.val + if node.right: + node = node.right + break + if stack: + node = stack.pop() + else: + node = None + + return diff diff --git a/Week_01/id_3/stack_queue/1021/LeetCode_1021_3_v1.py b/Week_01/id_3/stack_queue/1021/LeetCode_1021_3_v1.py new file mode 100644 index 00000000..b653c38c --- /dev/null +++ b/Week_01/id_3/stack_queue/1021/LeetCode_1021_3_v1.py @@ -0,0 +1,13 @@ +def remove_outer_parentheses(S): + stack = [] + r = [] + for c in S: + if c == '(': + stack.append(c) + if len(stack) != 1: + r.append(c) + else: + stack.pop() + if len(stack) != 0: + r.append(c) + return ''.join(r) diff --git a/Week_01/id_3/stack_queue/1021/LeetCode_1021_3_v2.py b/Week_01/id_3/stack_queue/1021/LeetCode_1021_3_v2.py new file mode 100644 index 00000000..19fd7b3e --- /dev/null +++ b/Week_01/id_3/stack_queue/1021/LeetCode_1021_3_v2.py @@ -0,0 +1,13 @@ +def remove_outer_parentheses(S): + count = 0 + r = [] + for c in S: + if c == '(': + count += 1 + if count != 1: + r.append(c) + else: + count -= 1 + if count != 0: + r.append(c) + return ''.join(r) diff --git a/Week_01/id_3/stack_queue/1021/test_1021.py b/Week_01/id_3/stack_queue/1021/test_1021.py new file mode 100644 index 00000000..e1bf4cb7 --- /dev/null +++ b/Week_01/id_3/stack_queue/1021/test_1021.py @@ -0,0 +1,15 @@ +import lc_1021_v1 +import lc_1021_v2 + +# f = lc_1021_v1.remove_outer_parentheses +f = lc_1021_v2.remove_outer_parentheses + + +def check(s, r): + _r = f(s) + print(_r, r, _r == r) + + +check('(()())(())', '()()()') +check('(()())(())(()(()))', '()()()()(())') +check('()()', '') diff --git a/Week_01/id_3/stack_queue/1047/LeetCode_1047_3_v1.py b/Week_01/id_3/stack_queue/1047/LeetCode_1047_3_v1.py new file mode 100644 index 00000000..1a82b5d2 --- /dev/null +++ b/Week_01/id_3/stack_queue/1047/LeetCode_1047_3_v1.py @@ -0,0 +1,13 @@ +def remove_duplicates(S): + if not S: + return None + stack = [None] + for c in S: + if c == stack[-1]: + stack.pop() + else: + stack.append(c) + return ''.join(stack[1:]) + + +print(remove_duplicates('abbaca'), 'ca') diff --git a/Week_02/id_3/NOTE.md b/Week_02/id_3/NOTE.md index 107ea7d6..b22dea54 100644 --- a/Week_02/id_3/NOTE.md +++ b/Week_02/id_3/NOTE.md @@ -1 +1,21 @@ # 学习笔记 +Iterator + +读题很重要 二叉树的序列化的教训 + +import heapq 堆 + +技巧 python中处理数字的时候小心使用 if v 或者 if not v 这种写法 +有时候想判断None,结果在0上栽了跟头 + +问题: +bst + 最大值 是否等价于堆 +python 的链表/堆等数据结构是否缺失 + +bs中很多实现使用系统最大值最小值,是否有隐患 + +python 整除 // + +实现数据结构,借助面向对象的成员变量,是一个好办法吗? + +python 的整除写法似乎比 int()来处理更快 diff --git a/Week_02/id_3/bstree/220/LeetCode_220_3_v1.py b/Week_02/id_3/bstree/220/LeetCode_220_3_v1.py new file mode 100644 index 00000000..b42c0b0e --- /dev/null +++ b/Week_02/id_3/bstree/220/LeetCode_220_3_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 - 1 + + 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)) diff --git a/Week_02/id_3/bstree/220/LeetCode_220_3_v2.py b/Week_02/id_3/bstree/220/LeetCode_220_3_v2.py new file mode 100644 index 00000000..5a5f8855 --- /dev/null +++ b/Week_02/id_3/bstree/220/LeetCode_220_3_v2.py @@ -0,0 +1,56 @@ +""" +暴力解法时间复杂度 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: + 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)) 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)) 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 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..3d6c0c84 --- /dev/null +++ b/Week_02/id_3/bstree/315/LeetCode_315_3_v1.py @@ -0,0 +1,34 @@ +""" + 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, _sorted, v): + low = 0 + high = len(_sorted) - 1 + while low <= high: + mid = low + (high-low)//2 + if _sorted[mid] >= v: + high = mid - 1 + else: + low = mid + 1 + + _sorted.insert(low, v) + return low + + +s = Solution() +print(s.countSmaller([5, 2, 6, 1]) == [2, 1, 1, 0]) +print(s.countSmaller([-1, -1]) == [0, 0]) 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_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 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..7ad22d93 --- /dev/null +++ b/Week_02/id_3/bstree/98/LeetCode_98_3_v3.py @@ -0,0 +1,20 @@ +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) 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)) 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")) 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 new file mode 100644 index 00000000..64babe7e --- /dev/null +++ b/Week_02/id_3/hash/692/LeetCode_692_3_v1.py @@ -0,0 +1,40 @@ +""" + 使用数组排序,居然就过了 + 代码有些丑陋,主要是对python不熟悉,不知道怎么自定义排序规则 + 理论上使用最小堆做优化效果更好 +""" + + +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)) 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 new file mode 100644 index 00000000..cfd87755 --- /dev/null +++ b/Week_02/id_3/hash/726/LeetCode_726_3_v1.py @@ -0,0 +1,73 @@ +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 == ')': + 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 + 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') 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 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..81838d61 --- /dev/null +++ b/Week_02/id_3/tree/LeetCode_103_3_v1.py @@ -0,0 +1,26 @@ +""" +正常广度优先遍历 在插入结果的时候进行反转 +""" + +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..a22d929e --- /dev/null +++ b/Week_02/id_3/tree/LeetCode_103_3_v2.py @@ -0,0 +1,38 @@ +""" +复杂版本的实现 在插入和迭代的时候就直接有倒序的元素 +""" + + +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 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 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) 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..c026cd4d --- /dev/null +++ b/Week_02/id_3/tree/LeetCode_297_3_v1.py @@ -0,0 +1,62 @@ +class TreeNode(object): + def __init__(self, x): + self.val = x + self.left = None + self.right = None + + +class Codec: + + def serialize(self, root): + data = [] + 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] + 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): + if not data: + return None + + root = TreeNode(data[0]) + queue = [root] + length = len(data) + + 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 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..22bbdb8b --- /dev/null +++ b/Week_02/id_3/tree/test_297.py @@ -0,0 +1,2015 @@ +import LeetCode_297_3_v1 + +Codec = LeetCode_297_3_v1.Codec + +codec = Codec() + + +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 +# ]) 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 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]])) 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"])) 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] +])) 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..d3ebd1b3 --- /dev/null +++ b/Week_03/id_3/dfs/LeetCode_529_3_v1.py @@ -0,0 +1,76 @@ +""" +典型二维数组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 self.check_out_border(board, i, j): + 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 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() + 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']]) 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..1a83c9a7 --- /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 _ in range(numCourses)] + topology_list = [0 for _ 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..5420fea2 --- /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 _ in range(numCourses)] + topology_list = [0 for _ 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]: + 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]])) +print(s.canFinish(4, [[1, 0], [2, 1], [0, 2], [2, 3]])) diff --git a/Week_03/id_3/graph/LeetCode_210_3_v1.py b/Week_03/id_3/graph/LeetCode_210_3_v1.py new file mode 100644 index 00000000..2588db30 --- /dev/null +++ b/Week_03/id_3/graph/LeetCode_210_3_v1.py @@ -0,0 +1,34 @@ +""" +经典的拓扑排序 +numCourses 课程数 +prerequisites 课程依赖关系 也就是边列表 +BFS +""" + + +class Solution: + def findOrder(self, numCourses, prerequisites): + queue = [] + node_list = [[] for _ in range(numCourses)] + topology_list = [0 for _ 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) + + if len(results) != numCourses: + return [] + return results 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..f4a13554 --- /dev/null +++ b/Week_03/id_3/graph/LeetCode_210_3_v2.py @@ -0,0 +1,41 @@ +""" +经典的拓扑排序 +numCourses 课程数 +prerequisites 课程依赖关系 也就是边列表 +DFS + +由于我使用的是从起点向后下钻,当遇到新的入度为0的节点才下钻,所以不会出现死循环的问题。 +如果是从后向前,或者不判断入度数量,可能就需要一个visited的缓存来判断是否在迭代过程中出现了环。 +""" + + +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 = [] + for e in list(filter(lambda e: e[1] == 0, enumerate(topology_list))): + results.append(e[0]) + self.dfs(e[0], node_list, topology_list, results) + + if len(results) != numCourses: + return [] + return results + + 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) + self.dfs(sn, node_list, topology_list, results) + + +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]])) 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) +