10.5 每日一題 18. 四數之和
給定一個包含 n
個整數的陣列 nums
和一個目標值 target
,判斷 nums
中是否存在四個元素 a
,b
,c
和 d
,使得 a + b + c + d
的值與 target
相等?找出所有滿足條件且不重複的四元組。
注意:
答案中不可以包含重複的四元組。
示例:
給定陣列 nums = [1, 0, -1, 0, -2, 2],和 target = 0。
滿足要求的四元組集合為:
[
[-1, 0, 0, 1],
[-2, -1, 1, 2],
[-2, 0, 0, 2]
]
通過次數112,058
提交次數290,816
程式碼實現
- 無優化程式碼
class Solution:
def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
nums.sort()
if len(nums)<4:
return []
res = []
for i in range(len(nums)-3):
for j in range(len(nums)-1, i+2, -1):
cur = nums[i]+nums[j]
k = i+1
while i<k<j:
red = target-cur-nums[k]
if red<nums[k]:
break
if red not in nums[k+1:j]:
k+=1
continue
if [nums[i],nums[j],nums[k],red] not in res:
res.append([nums[i],nums[j],nums[k],red])
k+=1
return res
- 優化程式碼
class Solution:
def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
nums.sort()
hashs = {}
for i in range(len(nums)):
for j in range(i+1,len(nums)):
temp = nums[i]+nums[j]
if temp not in hashs:
hashs[temp] = [[i,j]]
else:
hashs[temp].append([i,j])
res = []
pref1 = None
if len(nums) <4:
return res
for f1 in range(len(nums)-3):
if nums[f1]==pref1:
continue
pref1 = nums[f1]
pref2 = None
for f2 in range(f1+1, len(nums)-2):
if nums[f2]==pref2:
continue
pref2 = nums[f2]
target2 = target-pref1-pref2
if target2 not in hashs:
continue
temps = hashs[target2]
pref3 = None
for i in temps:
if i[0]<=f2 or nums[i[0]]==pref3:
continue
pref3 = nums[i[0]]
res.append([pref1,pref2,nums[i[0]],nums[i[1]]])
return res
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/4sum
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
相關文章
- 【10月打卡~Leetcode每日一題】18. 四數之和(難度:中等)LeetCode每日一題
- Leetcode[陣列] 18. 四數之和LeetCode陣列
- Day 7| 454.四數相加II 、383. 贖金信 、15. 三數之和 、18. 四數之和
- LeetCode每日一題:兩數之和(No.1)LeetCode每日一題
- LeetCode每日一題 (32)1. 兩數之和LeetCode每日一題
- day7雜湊表 454.四數相加II |383. 贖金信|15. 三數之和 |18. 四數之和
- 18. 4Sum(Leetcode每日一題-2020.10.05)LeetCode每日一題
- 程式碼隨想錄刷題day 7 | 雜湊表part02 454.四數相加II 383. 贖金信 15. 三數之和 18. 四數之和
- 每日一道演算法題:1.兩數之和演算法
- 兩數之和,三數之和,最接近的三數之和,四數之和
- 每日一道 LeetCode (1):兩數之和LeetCode
- 【LeetCode】每日一題129:求根到葉子節點數字之和LeetCode每日一題
- 挑戰演算法題:四數之和演算法
- 程式碼隨想錄演算法訓練營day07|454.四數相加II,383.贖金信,15.三數之和,18.四數之和演算法
- 每日一道演算法, 《兩數之和》演算法
- LeetCode 每日一題,用 Go 實現兩數之和的非暴力解法LeetCode每日一題Go
- 18_四數之和
- [每日一題] 第四題:圓圈中最後剩下的數字每日一題
- LeetCode18:四數之和LeetCode
- 程式碼隨想錄演算法訓練營第七天 | 四數之和、贖金信、三數之和、四數之和2演算法
- Leetcode第一題:兩數之和(3種語言)LeetCode
- 演算法題:三數之和演算法
- C++每日一練26-四數相加 IIC++
- LeetCode 之 JavaScript 解答第一題 —— 兩數之和(Two Sum)LeetCodeJavaScript
- 力扣 204. 計數質數(每日一題)力扣每日一題
- 每日一題:五 特別的數字每日一題
- 每日一題10009-反轉數字每日一題
- LeetCode每日一題:迴文數(No.9)LeetCode每日一題
- LeetCode每日一題:自除數(No.728)LeetCode每日一題
- LeetCode每日一題:求眾數(No.169)LeetCode每日一題
- LeetCode題集-1- 兩數之和LeetCode
- [LeetCode 刷題] 1. 兩數之和LeetCode
- 每日一題每日一題
- 一個小小的演算法題:求兩數之和演算法
- 【每日一題】【埃氏篩】204. 計數質數每日一題
- [每日一題] 第二十題:最小的k個數每日一題
- LeetCode每日一題: 猜數字大小(No.374)LeetCode每日一題
- LeetCode每日一題:整數反轉(No.7)LeetCode每日一題