From 20e3c769e93b45fd587ede2a57c1f337e394c0f6 Mon Sep 17 00:00:00 2001 From: Igneaalis Date: Sun, 10 May 2020 02:40:16 +0300 Subject: [PATCH 1/7] Added solution --- README.md | 1 - arrays.md | 103 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 103 insertions(+), 1 deletion(-) delete mode 100644 README.md create mode 100644 arrays.md diff --git a/README.md b/README.md deleted file mode 100644 index 4372b78..0000000 --- a/README.md +++ /dev/null @@ -1 +0,0 @@ -# algorithms \ No newline at end of file diff --git a/arrays.md b/arrays.md new file mode 100644 index 0000000..d93671c --- /dev/null +++ b/arrays.md @@ -0,0 +1,103 @@ +# Arrays + +## Two sum + +https://leetcode.com/problems/two-sum/ + +```python +class Solution(object): + @staticmethod + def twoSum(nums, target): + """ + :type nums: List[int] + :type target: int + :rtype: List[int] + """ + + print(nums, target) + out = {} + for i in range(len(nums)): + if target - nums[i] in out: + return [out[target - nums[i]], i] + out[nums[i]] = i + + +print(Solution.twoSum([2, 7, 11, 15], 9)) # [2, 7, 11, 15] 9 \n[0, 1] + +``` + +## Three sum + +https://leetcode.com/problems/3sum/ + +```python +class Solution(object): + @staticmethod + def threeSum(nums): + """ + :type nums: List[int] + :rtype: List[List[int]] + """ + + print(nums) + out = [] + for i in range(len(nums)): + tmp = Solution.twoSum(nums, -nums[i], i) + if tmp: + tmp.append(nums[i]) + tmp.sort() + if tmp not in out: + out.append(tmp) + return out + + @staticmethod + def twoSum(nums, target, removed): + """ + :type nums: List[int] + :type target: int + :type removed: int + :rtype: List[int] + """ + + out = {} + for i in range(len(nums)): + if i == removed: + continue + if target - nums[i] in out: + return [nums[out[target - nums[i]]], nums[i]] + out[nums[i]] = i + + +print(Solution.threeSum([-1, 0, 1, 2, -1, -4])) # [-1, 0, 1, 2, -1, -4] \n[[-1, 0, 1], [-1, -1, 2]] + +``` + +## Subarray sum equals k + +https://leetcode.com/problems/subarray-sum-equals-k/ + +```python +from collections import defaultdict +from itertools import accumulate + + +class Solution(object): + @staticmethod + def subarraySum(nums, k): + """ + :type nums: List[int] + :type k: int + :rtype: int + """ + + print(nums) + _list, _dict, out = [0] + list(accumulate(nums)), defaultdict(int), 0 + for i in range(len(nums)): + _dict[_list[i]] += 1 + out += _dict[_list[i + 1] - k] + return out + + +print(Solution.subarraySum([1, 1, 1], 2)) # [1, 1, 1] \n2 + +``` \ No newline at end of file From d55c8038d849271c12a6c3f92a79ff3ccd046ecc Mon Sep 17 00:00:00 2001 From: Igneaalis Date: Wed, 13 May 2020 15:32:09 +0300 Subject: [PATCH 2/7] three sum doesn't work --- arrays.md | 48 ++++++++++++++++-------------------------------- 1 file changed, 16 insertions(+), 32 deletions(-) diff --git a/arrays.md b/arrays.md index d93671c..73d7664 100644 --- a/arrays.md +++ b/arrays.md @@ -6,24 +6,19 @@ https://leetcode.com/problems/two-sum/ ```python class Solution(object): - @staticmethod - def twoSum(nums, target): + def twoSum(self, nums, target): """ :type nums: List[int] :type target: int :rtype: List[int] """ - print(nums, target) out = {} for i in range(len(nums)): if target - nums[i] in out: return [out[target - nums[i]], i] out[nums[i]] = i - -print(Solution.twoSum([2, 7, 11, 15], 9)) # [2, 7, 11, 15] 9 \n[0, 1] - ``` ## Three sum @@ -32,25 +27,6 @@ https://leetcode.com/problems/3sum/ ```python class Solution(object): - @staticmethod - def threeSum(nums): - """ - :type nums: List[int] - :rtype: List[List[int]] - """ - - print(nums) - out = [] - for i in range(len(nums)): - tmp = Solution.twoSum(nums, -nums[i], i) - if tmp: - tmp.append(nums[i]) - tmp.sort() - if tmp not in out: - out.append(tmp) - return out - - @staticmethod def twoSum(nums, target, removed): """ :type nums: List[int] @@ -67,8 +43,21 @@ class Solution(object): return [nums[out[target - nums[i]]], nums[i]] out[nums[i]] = i + def threeSum(self, nums): + """ + :type nums: List[int] + :rtype: List[List[int]] + """ -print(Solution.threeSum([-1, 0, 1, 2, -1, -4])) # [-1, 0, 1, 2, -1, -4] \n[[-1, 0, 1], [-1, -1, 2]] + out = [] + for i in range(len(nums)): + tmp = twoSum(nums, -nums[i], i) + if tmp: + tmp.append(nums[i]) + tmp.sort() + if tmp not in out: + out.append(tmp) + return out ``` @@ -82,22 +71,17 @@ from itertools import accumulate class Solution(object): - @staticmethod - def subarraySum(nums, k): + def subarraySum(self, nums, k): """ :type nums: List[int] :type k: int :rtype: int """ - print(nums) _list, _dict, out = [0] + list(accumulate(nums)), defaultdict(int), 0 for i in range(len(nums)): _dict[_list[i]] += 1 out += _dict[_list[i + 1] - k] return out - -print(Solution.subarraySum([1, 1, 1], 2)) # [1, 1, 1] \n2 - ``` \ No newline at end of file From 10b1363bab154ef403195ed8e0cae33c398f5486 Mon Sep 17 00:00:00 2001 From: Igneaalis Date: Wed, 13 May 2020 17:35:22 +0300 Subject: [PATCH 3/7] Three sum generator solution (O^3) --- arrays.md | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/arrays.md b/arrays.md index 73d7664..c9bd40a 100644 --- a/arrays.md +++ b/arrays.md @@ -27,7 +27,8 @@ https://leetcode.com/problems/3sum/ ```python class Solution(object): - def twoSum(nums, target, removed): + + def twoSum(self, nums, target, removed): """ :type nums: List[int] :type target: int @@ -35,13 +36,11 @@ class Solution(object): :rtype: List[int] """ - out = {} - for i in range(len(nums)): + for i, n in enumerate(nums): if i == removed: continue - if target - nums[i] in out: - return [nums[out[target - nums[i]]], nums[i]] - out[nums[i]] = i + if target - n in nums and i != nums.index(target - n) and removed != nums.index(target - n): + yield sorted([n, target - n]) def threeSum(self, nums): """ @@ -50,13 +49,14 @@ class Solution(object): """ out = [] - for i in range(len(nums)): - tmp = twoSum(nums, -nums[i], i) - if tmp: - tmp.append(nums[i]) - tmp.sort() - if tmp not in out: - out.append(tmp) + for i, n in enumerate(nums): + pairs = [] + for x in self.twoSum(nums, -n, i): + if x not in pairs: + pairs.append(x) + for p in pairs: + if sorted(p + [n]) not in out: + out += [sorted(p + [n])] return out ``` From 1d9e85d4e31382c68254ea606952de1507fbb245 Mon Sep 17 00:00:00 2001 From: Igneaalis Date: Wed, 13 May 2020 18:07:51 +0300 Subject: [PATCH 4/7] Three sum Set + Hash solution (O^3) --- arrays.md | 52 ++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 44 insertions(+), 8 deletions(-) diff --git a/arrays.md b/arrays.md index c9bd40a..76d3987 100644 --- a/arrays.md +++ b/arrays.md @@ -21,7 +21,7 @@ class Solution(object): ``` -## Three sum +## Three sum (Generator version, O(n^3)) https://leetcode.com/problems/3sum/ @@ -36,11 +36,11 @@ class Solution(object): :rtype: List[int] """ - for i, n in enumerate(nums): + for i, v in enumerate(nums): if i == removed: continue - if target - n in nums and i != nums.index(target - n) and removed != nums.index(target - n): - yield sorted([n, target - n]) + if target - v in nums and i != nums.index(target - v) and removed != nums.index(target - v): + yield sorted([v, target - v]) def threeSum(self, nums): """ @@ -49,18 +49,54 @@ class Solution(object): """ out = [] - for i, n in enumerate(nums): + for i, v in enumerate(nums): pairs = [] - for x in self.twoSum(nums, -n, i): + for x in self.twoSum(nums, -v, i): if x not in pairs: pairs.append(x) for p in pairs: - if sorted(p + [n]) not in out: - out += [sorted(p + [n])] + if sorted(p + [v]) not in out: + out += [sorted(p + [v])] return out ``` +## Three sum (Set + hash version O(n^2)) + +https://leetcode.com/problems/3sum/ + +```python +class Solution(object): + + def twoSum(self, nums, target, removed): + """ + :type nums: List[int] + :type target: int + :type removed: set + :rtype: List[int] + """ + + dict = {} + for i, v in enumerate(nums): + if target - v in dict: + removed.add((v, target - v, -target)) + dict[v] = i + del dict + + def threeSum(self, nums): + """ + :type nums: List[int] + :rtype: List[List[int]] + """ + + nums.sort() + out = set() + for i, v in enumerate(nums): + self.twoSum(nums[i + 1:], -v, out) + return list(list(x) for x in out) + +``` + ## Subarray sum equals k https://leetcode.com/problems/subarray-sum-equals-k/ From ec1091c92c64bd2d26ccbcb217e337a826da9c37 Mon Sep 17 00:00:00 2001 From: Igneaalis Date: Wed, 13 May 2020 18:40:46 +0300 Subject: [PATCH 5/7] Subarray sum equals k solution --- arrays.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/arrays.md b/arrays.md index 76d3987..cedaccd 100644 --- a/arrays.md +++ b/arrays.md @@ -103,7 +103,6 @@ https://leetcode.com/problems/subarray-sum-equals-k/ ```python from collections import defaultdict -from itertools import accumulate class Solution(object): @@ -114,7 +113,7 @@ class Solution(object): :rtype: int """ - _list, _dict, out = [0] + list(accumulate(nums)), defaultdict(int), 0 + _list, _dict, out = [0] + [sum(nums[:i + 1]) for i, v in enumerate(nums)], defaultdict(int), 0 for i in range(len(nums)): _dict[_list[i]] += 1 out += _dict[_list[i + 1] - k] From 5eb31e419f8341cc4cb074efec68d52b60c80cc2 Mon Sep 17 00:00:00 2001 From: Igneaalis Date: Fri, 22 May 2020 19:10:06 +0300 Subject: [PATCH 6/7] Changed variables' name, added hyperlinks (anchors), improved [Subarray Sum Equals K problem] --- arrays.md | 53 +++++++++++++++++++++++++++++------------------------ 1 file changed, 29 insertions(+), 24 deletions(-) diff --git a/arrays.md b/arrays.md index cedaccd..c000fe0 100644 --- a/arrays.md +++ b/arrays.md @@ -1,5 +1,10 @@ # Arrays ++ [Two Sum](#two-sum) ++ [Three sum (Generator version, O(n^3))](#three-sum-generator-version-on3) ++ [Three sum (Set + hash version O(n^2))](#three-sum-set--hash-version-on2) ++ [Subarray Sum Equals K](#subarray-sum-equals-k) + ## Two sum https://leetcode.com/problems/two-sum/ @@ -13,11 +18,11 @@ class Solution(object): :rtype: List[int] """ - out = {} - for i in range(len(nums)): - if target - nums[i] in out: - return [out[target - nums[i]], i] - out[nums[i]] = i + indices = {} + for index in range(len(nums)): + if target - nums[index] in indices: + return [indices[target - nums[index]], index] + indices[nums[index]] = index ``` @@ -36,11 +41,11 @@ class Solution(object): :rtype: List[int] """ - for i, v in enumerate(nums): - if i == removed: + for index, value in enumerate(nums): + if index == removed: continue - if target - v in nums and i != nums.index(target - v) and removed != nums.index(target - v): - yield sorted([v, target - v]) + if target - value in nums and index != nums.index(target - value) and removed != nums.index(target - value): + yield sorted([value, target - value]) def threeSum(self, nums): """ @@ -48,16 +53,16 @@ class Solution(object): :rtype: List[List[int]] """ - out = [] - for i, v in enumerate(nums): + triplets = [] + for index, value in enumerate(nums): pairs = [] - for x in self.twoSum(nums, -v, i): + for x in self.twoSum(nums, -value, index): if x not in pairs: pairs.append(x) for p in pairs: - if sorted(p + [v]) not in out: - out += [sorted(p + [v])] - return out + if sorted(p + [value]) not in triplets: + triplets += [sorted(p + [value])] + return triplets ``` @@ -77,10 +82,10 @@ class Solution(object): """ dict = {} - for i, v in enumerate(nums): - if target - v in dict: - removed.add((v, target - v, -target)) - dict[v] = i + for index, value in enumerate(nums): + if target - value in dict: + removed.add((value, target - value, -target)) + dict[value] = index del dict def threeSum(self, nums): @@ -91,8 +96,8 @@ class Solution(object): nums.sort() out = set() - for i, v in enumerate(nums): - self.twoSum(nums[i + 1:], -v, out) + for index, value in enumerate(nums): + self.twoSum(nums[index + 1:], -value, out) return list(list(x) for x in out) ``` @@ -113,10 +118,10 @@ class Solution(object): :rtype: int """ - _list, _dict, out = [0] + [sum(nums[:i + 1]) for i, v in enumerate(nums)], defaultdict(int), 0 + _list, _dict, sums_count = [0] + [sum(nums[:index + 1]) for index in range(len(nums))], defaultdict(int), 0 for i in range(len(nums)): _dict[_list[i]] += 1 - out += _dict[_list[i + 1] - k] - return out + sums_count += _dict[_list[i + 1] - k] + return sums_count ``` \ No newline at end of file From 1c3e8fd6234296591270fb639cbb1c5ebd8006bd Mon Sep 17 00:00:00 2001 From: Igneaalis Date: Wed, 3 Jun 2020 13:04:22 +0300 Subject: [PATCH 7/7] Divided solutions into branches. --- arrays.md | 100 ------------------------------------------------------ 1 file changed, 100 deletions(-) diff --git a/arrays.md b/arrays.md index c000fe0..ced2cb4 100644 --- a/arrays.md +++ b/arrays.md @@ -1,107 +1,7 @@ # Arrays -+ [Two Sum](#two-sum) -+ [Three sum (Generator version, O(n^3))](#three-sum-generator-version-on3) -+ [Three sum (Set + hash version O(n^2))](#three-sum-set--hash-version-on2) + [Subarray Sum Equals K](#subarray-sum-equals-k) -## Two sum - -https://leetcode.com/problems/two-sum/ - -```python -class Solution(object): - def twoSum(self, nums, target): - """ - :type nums: List[int] - :type target: int - :rtype: List[int] - """ - - indices = {} - for index in range(len(nums)): - if target - nums[index] in indices: - return [indices[target - nums[index]], index] - indices[nums[index]] = index - -``` - -## Three sum (Generator version, O(n^3)) - -https://leetcode.com/problems/3sum/ - -```python -class Solution(object): - - def twoSum(self, nums, target, removed): - """ - :type nums: List[int] - :type target: int - :type removed: int - :rtype: List[int] - """ - - for index, value in enumerate(nums): - if index == removed: - continue - if target - value in nums and index != nums.index(target - value) and removed != nums.index(target - value): - yield sorted([value, target - value]) - - def threeSum(self, nums): - """ - :type nums: List[int] - :rtype: List[List[int]] - """ - - triplets = [] - for index, value in enumerate(nums): - pairs = [] - for x in self.twoSum(nums, -value, index): - if x not in pairs: - pairs.append(x) - for p in pairs: - if sorted(p + [value]) not in triplets: - triplets += [sorted(p + [value])] - return triplets - -``` - -## Three sum (Set + hash version O(n^2)) - -https://leetcode.com/problems/3sum/ - -```python -class Solution(object): - - def twoSum(self, nums, target, removed): - """ - :type nums: List[int] - :type target: int - :type removed: set - :rtype: List[int] - """ - - dict = {} - for index, value in enumerate(nums): - if target - value in dict: - removed.add((value, target - value, -target)) - dict[value] = index - del dict - - def threeSum(self, nums): - """ - :type nums: List[int] - :rtype: List[List[int]] - """ - - nums.sort() - out = set() - for index, value in enumerate(nums): - self.twoSum(nums[index + 1:], -value, out) - return list(list(x) for x in out) - -``` - ## Subarray sum equals k https://leetcode.com/problems/subarray-sum-equals-k/