給你一個包含 n 個整數的數組 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?請你找出所有滿足條件且不重複的三元組。
注意:答案中不可以包含重複的三元組。
示例:
給定數組 nums = [-1, 0, 1, 2, -1, -4],
滿足要求的三元組集合爲:
[
[-1, 0, 1],
[-1, -1, 2]
]
思路:
1、題目分析
在這個數組中找出三個數,這三個數之和是0。
2、解題分析
- 先判斷數組長度,如果小於3直接返回空,如果不是則繼續處理
- 對數組進升序排序,然後開始遍歷數組
- 如果num[i]大於0直接返回res因爲;本來就是排序過的num[i+1]>num[i]。
- 如果相鄰兩個數是一毛一樣的;那就continue
- 設置左右邊界;然後一定滿足左邊界小於右邊界,否則直接返回res
- 如果三個數之和等於0,添加到結果去然後再執行去重操作
- 如果左邊的下個元素和當前元素一致那就向右移動
- 如果右邊的下個元素和當前元素一致那就向左移動
- 在執行左邊界+1;右邊界-1
- 如果三個數之和大於0,將右邊界-1
- 如果三個數之和小於0,將左邊界+1
- 如果三個數之和等於0,添加到結果去然後再執行去重操作
第一次這樣寫算法流程,感覺這樣思路比較清晰一點,以後就這樣分析唄,上代碼:
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
res = []
size = len(nums)
#如果長度不滿足直接返回空
if not nums or size<3:
return res
#對數組進行排序
nums.sort()
for i in range(len(nums)):
#大於0直接返回
if nums[i]>0:
return res
#去除重複的元素
if i>0 and nums[i]==nums[i-1]:
continue
#設置左右邊界
L=i+1
R=size-1
while L<R:
#滿足結果直接添加到數組
s = nums[i]+nums[L]+nums[R]
if s==0:
res.append([nums[i],nums[L],nums[R]])
#去重
while L<R and nums[L+1]==nums[L] :
L=L+1
while L<R and nums[R-1]==nums[R]:
R=R-1
L=L+1
R=R-1
#如果大於0右邊界減1
elif s>0:
R=R-1
#如果小於0左邊界加1
else:
L=L+1
return res