題目:
給你一個包含 n 個整數的數組 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?請你找出所有滿足條件且不重複的三元組。
注意:答案中不可以包含重複的三元組。
示例:
給定數組 nums = [-1, 0, 1, 2, -1, -4],
滿足要求的三元組集合爲:
[
[-1, 0, 1],
[-1, -1, 2]
]
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/3sum
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
個人思路:
首先遍歷。。肯定是不對的。先排序再頭選一個尾選一個二分查找?感覺也不對勁。棄療。
官方答案推薦:
確實是排序先選定一個,再頭選一個尾選一個,最佳時間複雜度 也就是O(n^2),用的不是二分查找而是普通的遍歷。
①相同元素則跳過,因爲組合已經在上一個元素出列出來了;
②當起始選定元素>0時則跳出循環,因爲都>0肯定不滿足條件了;
③三元素之和sum>0,則尾指針right左移;sum<0,則頭指針left右移,直到left==right則更換起始元素。相同元素直接跳過。
python代碼:
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
result = []
nums.sort()
#三元組,所以只需要判斷len-2個元素
for k in range(len(nums)-2):
#k>0則跳出循環
if(nums[k]>0):
break
#相同元素則沒必要再判斷一次,注意要求k>0
if(k>0 and nums[k]==nums[k-1]):
continue
left=k+1
right=len(nums)-1
while left < right:
num = nums[k] + nums[left] + nums[right]
if num > 0:
right -= 1
elif num < 0:
left += 1
else:
result.append([nums[k],nums[left],nums[right]])
#不能缺少left<right這個條件!否則會越界
while left < right and nums[left] == nums[left+1]:
left +=1
while left < right and nums[right] == nums[right-1]:
right -=1
left += 1
right -= 1
return result
反思:
一開始的思路還是有一點正確的,就是有點想多了。。。