@@ -254,12 +254,113 @@ class Solution:
254
254
hashmap[num] = i
255
255
```
256
256
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
+
257
340
### [ 4sum-ii] ( https://leetcode.cn/problems/4sum-ii/ )
258
341
> 给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足:
259
342
> - 0 <= i, j, k, l < n
260
343
> - nums1[ i] + nums2[ j] + nums3[ k] + nums4[ l] == 0
261
344
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])]
262
361
362
+ return res
363
+ ```
263
364
264
365
265
366
### [ ransom-note] ( https://leetcode.cn/problems/ransom-note/ )
@@ -317,7 +418,7 @@ class Solution:
317
418
if k not in m_d or m_d[k] < v: return False
318
419
319
420
return True
320
- ```
421
+ ```
321
422
322
423
323
424
0 commit comments