給定乙個包含 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]
]
nums =[1
,-2,
-5,-
4,-3
,3,3
,5]target =-11
rs =
# 對數列進行遞增排序
nums.sort(
)# nums = [-5,-4,-3,1,3,3,3,5]
# print(nums)
# 設定最小的第乙個 指標 k
for k in
range
(len
(nums)-2
):# 設定l,r指標
r =len(nums)-1
# 指向最大 k 變化一次再次指向最後
l = k +
1# 不斷指向下乙個變換的
mid = l +
1# 不斷指向下乙個變換的中間指標
# 最小的指標指向大於1 與指向相同的結果時跳過
# print('k: %d,l: %d,mid: %d,r: %d' % (k, l, mid, r))
# print('nums[k]: %d,nums[l]: %d,nums[mid]: %d,nums[r]: %d' % (nums[k], nums[l], nums[mid], nums[r]))
if target >=
0and
(nums[k]
> target)
:# -5 > -11
break
if(k >0)
and(nums[k]
== nums[k -1]
):continue
for l in
range
(k +
1, r)
:# print('k: %d,l: %d,mid: %d,r: %d' % (k, l, mid, r))
# print('nums[k]: %d,nums[l]: %d,nums[mid]: %d,nums[r]: %d' % (nums[k], nums[l], nums[mid], nums[r]))
# 重置 r , mid 指標
r =len(nums)-1
mid = l +
1# 處理相同的指標元素 l,r
if(l > k +1)
and(nums[l]
== nums[l -1]
):continue
if(r <
len(nums)-1
)and
(nums[r]
== nums[r +1]
):r -=
1continue
# 判斷mid指標
while l <= mid < r:
# 去重 (處理相同的指標元素) 跳過本次迴圈進行下一輪迴圈
if(mid > l +1)
and(nums[mid]
== nums[mid -1]
):mid +=
1continue
s = nums[k]
+ nums[l]
+ nums[mid]
+ nums[r]
# print(s)
# s == 0 說明結果符合 將索引指向元素記錄
if s == target:
# targent = 0
[nums[k]
, nums[l]
, nums[mid]
, nums[r]])
mid +=
1 r -=
1# s < 0 的情況 說明 l 指標需要向後移一位
elif s < target:
mid +=
1# s>0 的情況說明 r 指標需要往前移一位
else
: r -=
1print
(rs)
雙指標法巢狀了三個迴圈o(n**3)複雜度過高
一下為另一種方法:
nums =[1
,0,-
1,0,
-2,2
]nums.sort(
)output =
target =
0def
search
(i, target, onesolution)
:if target ==
0and
len(onesolution)==4
:# 出口,找到正確的解了
return
elif
len(onesolution)
>
4or i >=
len(nums)
:# 剪枝,超範圍了
return
if target - nums[i]-(
3-len(onesolution)
)* nums[-1
]>
0or nums[i]
in notselected:
# 當前這個數太小了 target 減去nums[i](指定位置的元素) 加上 剩餘座位(最大的元素)依然大於0
# 說明當前位置元素太小了
# 應尋找下乙個 i+ 1
search(i +
1, target, onesolution)
elif target -(4
-len
(onesolution)
)* nums[i]
<0:
# 當前組數的和太大了 直接返回
return
else
:# 當前組數似乎沒毛病
search(i +
1, target, onesolution,notselect+nums[i]
)# 不選這個數
search(i +
1, target - nums[i]
, onesolution +
[nums[i]
],notselected)
# 選這個數
search(
0, target,
,)print
(output)
雙指標 四數之和
leetcode 18.四數之和 給定乙個包含 n 個整數的陣列 nums 和乙個目標值 target,判斷 nums 中是否存在四個元素 a,b,c 和 d 使得 a b c d 的值與 target 相等?找出所有滿足條件且不重複的四元組。注意 答案中不可以包含重複的四元組。示例 給定陣列 nu...
leetcode三數之和 雙指標
題目描述 給你乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c 使得 a b c 0 請你找出所有滿足條件且不重複的三元組。注意 答案中不可以包含重複的三元組。示例 給定陣列 nums 1,0,1,2,1,4 滿足要求的三元組集合為 1,0,1 1,1,2 題目分...
18 四數之和 雙指標
給定乙個包含 n 個整數的陣列 nums 和乙個目標值 target,判斷 nums 中是否存在四個元素 a,b,c 和 d 使得 a b c d 的值與 target 相等?找出所有滿足條件且不重複的四元組。注意 答案中不可以包含重複的四元組。示例 給定陣列 nums 1,0,1,0,2,2 和 ...