leetcode 四數之和 雙指標法

2021-10-10 01:48:18 字數 3375 閱讀 4829

給定乙個包含 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 和 ...