Leetcode第十五題:三數之和

題目:

給你一個包含 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

反思:

一開始的思路還是有一點正確的,就是有點想多了。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章