Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit f9269da

Browse files
committed
Update hash.md
2sum,3sum,4sum,4sum-2
1 parent a8b2332 commit f9269da

File tree

1 file changed

+102
-1
lines changed

1 file changed

+102
-1
lines changed

‎data_structure/hash.md‎

Lines changed: 102 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,12 +254,113 @@ class Solution:
254254
hashmap[num] = i
255255
```
256256

257+
### [3sum](https://leetcode.cn/problems/3sum/)
258+
> 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请
259+
> 你返回所有和为 0 且不重复的三元组。
260+
261+
> 注意:**答案中不可以包含重复的三元组**
262+
263+
思路:hash表的方法也能用,但使用双指针的解法更快
264+
265+
```python
266+
class Solution:
267+
def threeSum(self, nums: List[int]) -> List[List[int]]:
268+
if len(nums) < 3: return []
269+
270+
nums = sorted(nums)
271+
res = list()
272+
i = 0
273+
while i < len(nums):
274+
if nums[i] > 0: break
275+
target = 0 - nums[i]
276+
left, right = i + 1, len(nums) - 1
277+
while left < right:
278+
sum2 = nums[left] + nums[right]
279+
if sum2 == target:
280+
res.append([nums[i], nums[left], nums[right]])
281+
while left < right and nums[left+1] == nums[left]:left += 1
282+
while right > left and nums[right-1] == nums[right]: right -= 1
283+
left += 1
284+
right -= 1
285+
elif sum2 < target: left += 1
286+
else: right -= 1
287+
288+
while i + 1 < len(nums) and nums[i+1] == nums[i]: i += 1
289+
i += 1
290+
291+
return res
292+
```
293+
294+
### [4sum](https://leetcode.cn/problems/4sum/)
295+
>给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一>对应,则认为两个四元组重复):
296+
297+
> - 0 <= a, b, c, d < n
298+
> - a、b、c 和 d 互不相同
299+
> - nums[a] + nums[b] + nums[c] + nums[d] == target
300+
>你可以按 任意顺序 返回答案 。
301+
302+
跟上面的3sum一样,利用双指针进行转换,注意循环过程中剪枝和去重。
303+
304+
```python
305+
class Solution:
306+
def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
307+
if len(nums) < 4: return []
308+
nums.sort()
309+
310+
i = 0
311+
ans = list()
312+
while i < len(nums) - 3:
313+
if nums[i] * 4 > target: break
314+
tar3 = target - nums[i]
315+
j = i + 1
316+
while j < len(nums) - 2:
317+
if nums[j] * 3 > tar3: break
318+
tar2 = tar3 - nums[j]
319+
left, right = j + 1, len(nums)-1
320+
while left < right:
321+
if nums[left] * 2 > tar2: break
322+
sum2 = nums[left] + nums[right]
323+
if sum2 == tar2:
324+
ans.append([nums[i], nums[j], nums[left], nums[right]])
325+
while left < right and nums[left+1] == nums[left]: left += 1
326+
while left < right and nums[right-1] == nums[right]: right -= 1
327+
left += 1
328+
right -= 1
329+
elif sum2 < tar2: left += 1
330+
else: right -= 1
331+
while j + 1 < len(nums) and nums[j+1] == nums[j]: j+= 1
332+
j += 1
333+
334+
while i + 1 < len(nums) and nums[i + 1] == nums[i]: i += 1
335+
i += 1
336+
337+
return ans
338+
```
339+
257340
### [4sum-ii](https://leetcode.cn/problems/4sum-ii/)
258341
> 给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足:
259342
> - 0 <= i, j, k, l < n
260343
> - nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0
261344
345+
思路:这个题目跟前面的3sum和4sum不一样,只让找出个数且没有去重逻辑,跟2sum比较类似,所以使用hash表比较方便
346+
347+
```python
348+
from collections import defaultdict
349+
class Solution:
350+
def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int:
351+
res = 0
352+
n = len(nums1)
353+
hashmap = defaultdict(int)
354+
for i in range(n):
355+
for j in range(n):
356+
hashmap[nums1[i] + nums2[j]] += 1
357+
358+
for i in range(n):
359+
for j in range(n):
360+
res += hashmap[-(nums3[i] + nums4[j])]
262361

362+
return res
363+
```
263364

264365

265366
### [ransom-note](https://leetcode.cn/problems/ransom-note/)
@@ -317,7 +418,7 @@ class Solution:
317418
if k not in m_d or m_d[k] < v: return False
318419

319420
return True
320-
```
421+
```
321422

322423

323424

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /