列舉陣列中所有可能的互不相同的三元組使其和為0:排序+雙指標
先不考慮時間複雜度,最簡單的想法是列舉所有三元組:
for i in
range
(n):
for j in
range
(i+1
,n):
for k in
range
(j+1
,n):
[a[i]
,a[j]
,a[k]
])
這樣會有重複,那什麼導致了重複呢?無非是兩種情況:
[0,1,2]
和[2,0,1]
重複
[0,1,2]
和[0,1,2]
重複
首先可以通過限制a<=b<=c
來除去第乙個重複,具體操作是先對陣列排序再列舉。
其次可以通過限制只有當前列舉的元素和上乙個不相同來去除第二個重複。
這樣得到的答案就是沒有重複的了,但是o(n*3)還是太慢了。
又發現,當固定i
列舉j,k
時,設第一次滿足條件時為j1,k1
,第二次為j2,k2
,由於j1k2
,由此知可以同時列舉j,k
,也就是雙指標。
可以這樣理解,雙指標就是在滿足一定條件的情況下,把雙重迴圈變為一次遍歷。
class
solution
:def
threesum
(self, nums: list[
int])-
> list[list[
int]]:
n =len(nums)
if n<3:
return
nums.sort(
) res =
i=0while il = i+
1 r = n-
1while lif nums[l]
+nums[i]
+nums[r]==0
: tmp =
[nums[l]
,nums[i]
,nums[r]
]while l==nums[l]
: l+=
1while l==nums[r]
: r-=
1 l+=
1 r-=
1elif nums[l]
+nums[i]
+nums[r]
<0:
l+=1else
: r-=
1while i2and nums[i]
==nums[i+1]
: i+=
1 i+=
1return res
兩數之和,三數之和
兩數之和 方法一 暴力 throw new illegalargumentexception 時間複雜度 o n 2 空間複雜度 o 1 public int twosum int nums,int target throw newillegalargumentexception no twosum...
兩數之和 三數之和 四數之和
兩數之和意思就是 給你乙個陣列,從中找出兩個數字,讓他們的和等於乙個具體的target。找到所有這樣的兩個數。並且這兩個數字不能完全一樣。n數之和的意思是 給你乙個陣列,從中找出n個數字,讓他們的和等於乙個具體的target。找到所有這樣的n個數。並且這n個數字不能完全一樣。最基礎的,也是最關鍵的就...
兩數 三數之和
給定乙個整數陣列 nums 和乙個整數目標值 target,請你在該陣列中找出和為目標值的那兩個整數,並返回它們的陣列下標 你可以假設每種輸入只會對應乙個答案。但是,陣列中同乙個元素不能使用兩遍 你可以按任意順序返回答案 輸入 nums 2,7,11,15 target 9 輸出 0,1 解釋 因為...