1.題目:
給定乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得a + b + c = 0?找出所有滿足條件且不重複的三元組。
例如, 給定陣列 nums = [-1, 0, 1, 2, -1, -4],
滿足要求的三元組集合為:
[ [-1, 0, 1],
[-1, -1, 2]
]
2.**:
/*
對於演算法跳過i,m,n重複部分:
0 1 2 3 4 5 6 7 8 9
-2, -2, -2, 0, 0, 0, 1, 1, 3, 4
1.對於i跳過相同元素:
必須的,不然會出現重複序列
2.對於m,n跳過相同元素:
若要重複部分最後乙個:
0 1 2 3 4 5 6 7 8 9
-2, -2, -2, 0, 0, 0, 1, 1, 3, 4
i,m,n:沒有0,6,7和3,4,5,只有0,1,9
所以m,n選擇各自方向上第乙個,即
m==m-1=>m++
n==n+1=>n--
*/
遍歷+兩數之和:
class
solution
:def
threesum
(self, nums: list[
int])-
> list[list[
int]]:
r =nums.sort(
) lens =
len(nums)
for i in
range
(lens)
:if i>
0and nums[i]
==nums[i-1]
:continue
if nums[i]
>0:
return r
m = i+
1 n = lens-
1while mif nums[m]
+nums[n]
>
-nums[i]
: n = n-
1elif nums[m]
+nums[n]
<
-nums[i]
: m = m+
1else
:# print(i,m,n)
t =[nums[i]
,nums[m]
,nums[n]
] m = m+
1 n = n-
1while m== nums[m-1]
: m = m+
1while n>i and nums[n]
== nums[n+1]
: n = n-
1return r
對情況進行分類⇒ (3,0),(2,1),(1,1,1),(1,2),其中數字是相同的個數:
class
solution
:def
threesum
(self, nums: list[
int])-
> list[list[
int]]:
r =counts =
for i in nums:
counts[i]
= counts.get(i,0)
+1nums =
sorted
(counts)
lens =
len(nums)
for i,num in
enumerate
(nums)
:if counts[num]
>1:
#3,0
if num ==
0and counts[num]
>2:
[0,0
,0])
#2,1
elif-2
*num in nums and num!=0:
# if num>0:
# else:
[num,num,-2
*num]
)#1,1,1
#1,2
if num<0:
m,n = i+1,
len(nums)-1
while mif nums[m]
+nums[n]
>
-nums[i]
: n = n-
1elif nums[m]
+nums[n]
<
-nums[i]
: m = m+
1else
:[num,nums[m]
,nums[n]])
n = n-
1 m = m+
1return r
LeetCode 15 三數之和
15.給定乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c 使得 a b c 0 找出所有滿足條件且不重複的三元組。注意 答案中不可以包含重複的三元組 方法一,個人解法正確,但是效率太低,時間複雜度o n 3 時間超時,無法提交至leetcode public s...
leetcode 15 三數之和
給定乙個包含 n 個整數的陣列nums,判斷nums中是否存在三個元素 a,b,c 使得 a b c 0 找出所有滿足條件且不重複的三元組。注意 答案中不可以包含重複的三元組。例如,給定陣列 nums 1,0,1,2,1,4 滿足要求的三元組集合為 1,0,1 1,1,2 class solutio...
leetcode15 三數之和
給定乙個包含 n 個整數的陣列nums,判斷nums中是否存在三個元素 a,b,c 使得 a b c 0 找出所有滿足條件且不重複的三元組。注意 答案中不可以包含重複的三元組。例如,給定陣列 nums 1,0,1,2,1,4 滿足要求的三元組集合為 1,0,1 1,1,2 先找兩數之和,然後再用un...