Leetcode Day 6 - Advanced Hash Table
Focuses on more complex problems involving hash tables, such as multi-array sum combinations (4Sum II, 3Sum, 4Sum) and validating ransom note creation. These problems require more intricate use of hash maps to handle sums, counting, and combinations efficiently.
Hash Table 1
Diff | Problem | Python | Java |
---|---|---|---|
454 4Sum II | ✅ | ||
383 Ransom Note | ✅ | ||
15 3Sum | ✅ | ||
18 4Sum | ✅ |
4Sum II
Given four integer arrays nums1
, nums2
, nums3
, and nums4
all of length n
, return the number of tuples (i, j, k, l)
such that:
0 <= i, j, k, l < n
nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0
Example 1
1
2
3
4
5
6
Input: nums1 = [1,2], nums2 = [-2,-1], nums3 = [-1,2], nums4 = [0,2]
Output: 2
Explanation:
The two tuples are:
1. (0, 0, 0, 1) -> nums1[0] + nums2[0] + nums3[0] + nums4[1] = 1 + (-2) + (-1) + 2 = 0
2. (1, 1, 0, 0) -> nums1[1] + nums2[1] + nums3[0] + nums4[0] = 2 + (-1) + (-1) + 0 = 0
Example 2
1
2
Input: nums1 = [0], nums2 = [0], nums3 = [0], nums4 = [0]
Output: 1
Solution3
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution(object):
def fourSumCount(self, nums1, nums2, nums3, nums4):
record = dict()
n = len(nums1)
for i in range(n):
for j in range(n):
ab = nums1[i] + nums2[j]
if ab in record:
record[ab] += 1
else:
record[ab] = 1
count = 0
for k in range(n):
for l in range(n):
cd = - nums3[k] - nums4[l]
if cd in record:
count += record[cd]
return count
Similar Questions
Ransom Note
Given two strings ransomNote
and magazine
, return true
if ransomNote
can be constructed by using the letters from magazine
and false
otherwise.
Each letter in magazine
can only be used once in ransomNote
.
Example 1
1
2
Input: ransomNote = "a", magazine = "b"
Output: false
Example 2
1
2
Input: ransomNote = "aa", magazine = "ab"
Output: false
Example 3
1
2
Input: ransomNote = "aa", magazine = "aab"
Output: true
Solution6
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution(object):
def canConstruct(self, ransomNote, magazine):
from collections import Counter
counter_ransom = Counter(ransomNote)
counter_maga = Counter(magazine)
for k in counter_ransom.keys():
try:
if counter_maga[k] < counter_ransom[k]:
return False
except:
return False
return True
Similar Questions
Diff | Similar Questions | Python | Java |
---|---|---|---|
691 Stickers to Spell Word7 |
3Sum
Given an integer array nums
, return all the triplets [nums[i], nums[j], nums[k]]
such that i != j, i != k, and j != k
, and nums[i] + nums[j] + nums[k] == 0
.
Notice that the solution set must not contain duplicate triplets.
Example 1
1
2
3
4
5
6
7
8
Input: nums = [-1,0,1,2,-1,-4]
Output: [[-1,-1,2],[-1,0,1]]
Explanation:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0.
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0.
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0.
The distinct triplets are [-1,0,1] and [-1,-1,2].
Notice that the order of the output and the order of the triplets does not matter.
Example 2
1
2
3
Input: nums = [0,1,1]
Output: []
Explanation: The only possible triplet does not sum up to 0.
Example 3
1
2
3
Input: nums = [0,0,0]
Output: [[0,0,0]]
Explanation: The only possible triplet sums up to 0.
Solution9
Python
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
class Solution(object):
def threeSum(self, nums):
nums.sort()
if nums[0] > 0:
return []
result = []
for i in range(len(nums)):
if(i > 0 and nums[i-1] == nums[i]):
continue
left = i + 1
right = len(nums) - 1
while left < right:
s = nums[i] + nums[left] + nums[right]
if s == 0:
result.append([nums[i],nums[left],nums[right]])
left += 1
while(nums[left] == nums[left - 1] and left < right):
left += 1
elif s < 0:
left += 1
while(nums[left] == nums[left - 1] and left < right):
left += 1
else:
right -= 1
return result
Similar Questions
Diff | Similar Questions | Python | Java |
---|---|---|---|
16 3Sum Closest10 | |||
2909 Minimum Sum of Mountain Triplets II11 |
4Sum
Given an array nums
of n
integers, return an array of all the unique quadruplets [nums[a], nums[b], nums[c], nums[d]]
such that:
0 <= a, b, c, d < n
a, b, c, and d are distinct.
nums[a] + nums[b] + nums[c] + nums[d] == target
You may return the answer in any order.
Example 1
1
2
Input: nums = [1,0,-1,0,-2,2], target = 0
Output: [[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]
Example 2
1
2
Input: nums = [2,2,2,2,2], target = 8
Output: [[2,2,2,2]]
Solution12
Python
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
class Solution(object):
def fourSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[List[int]]
"""
nums.sort()
if((nums[0] > 0 and target < 0) or (nums[-1] < 0 and target > 0)):
return []
record = []
for i in range(len(nums) - 3):
for j in range(i + 1, len(nums) - 2):
left = j + 1
right = len(nums) - 1
while(left < right and right > j + 1):
s = nums[i] + nums[j] + nums[left] + nums[right]
if(s == target):
if ([nums[i],nums[j],nums[left],nums[right]] not in record):
record.append([nums[i],nums[j],nums[left],nums[right]])
right -= 1
elif(s < target):
left += 1
else:
right -= 1
return record
Reference
代码随想录-哈希表理论基础: https://programmercarl.com/哈希表理论基础.html#哈希表. ↩︎
Leetcode-454 4Sum II: https://leetcode.com/problems/4sum-ii/description/. ↩︎
代码随想录-四数相加II: https://programmercarl.com/0454.四数相加II.html#其他语言版本. ↩︎
Leetcode-18 4Sum: https://leetcode.com/problems/4sum/. ↩︎ ↩︎2
Leetcode-383 Ransom Note: https://leetcode.com/problems/ransom-note/description/. ↩︎
代码随想录-赎金信:https://programmercarl.com/0383.赎金信.html. ↩︎
Leetcode-691 Stickers to Spell Word: https://leetcode.com/problems/stickers-to-spell-word/. ↩︎
Leetcode-15 3Sum: https://leetcode.com/problems/3sum/description/. ↩︎
代码随想录-三数之和: https://programmercarl.com/0015.三数之和.html. ↩︎
Leetcode-16 3Sum Closest: https://leetcode.com/problems/3sum-closest/description/. ↩︎
Leetcode-2909 Minimum Sum of Mountain Triplets II: https://leetcode.com/problems/minimum-sum-of-mountain-triplets-ii/. ↩︎
代码随想录-四数之和:https://programmercarl.com/0018.四数之和.html#算法公开课 ↩︎