python三數之和


給定一個包含 n 個整數的數組 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?找出所有滿足條件且不重復的三元組。

注意:答案中不可以包含重復的三元組。

例如, 給定數組 nums = [-1, 0, 1, 2, -1, -4],

滿足要求的三元組集合為:
[
  [-1, 0, 1],
  [-1, -1, 2]
]
class Solution(object):
    def threeSum(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        # 存儲結果列表
        res_list = []
        # 對nums列表進行排序,無返回值,排序直接改變nums順序
        nums.sort()
        for i in range(len(nums)):
            # 如果排序后第一個數都大於0,則跳出循環,不可能有為0的三數之和
            if nums[i] > 0:
                break
            # 排序后相鄰兩數如果相等,則跳出當前循環繼續下一次循環,相同的數只需要計算一次
            if i > 0 and nums[i] == nums[i-1]:
                continue
            # 記錄i的下一個位置
            j = i + 1
            # 最后一個元素的位置
            k = len(nums) - 1
            while j < k:
                # 判斷三數之和是否為0
                if nums[j] + nums[k] == -nums[i]:
                    # 把結果加入數組中
                    res_list.append([nums[i], nums[j], nums[k]])
                    # 判斷j相鄰元素是否相等,有的話跳過這個
                    while j < k and nums[j] == nums[j+1]: j += 1
                    # 判斷后面k的相鄰元素是否相等,是的話跳過
                    while j < k and nums[k] == nums[k-1]: k -= 1
                    # 沒有相等則j+1,k-1,縮小范圍
                    j += 1
                    k -= 1
                # 小於-nums[i]的話還能往后取
                elif nums[j] + nums[k] < -nums[i]:
                    j += 1
                else:
                    k -= 1
        return res_list


if __name__ == '__main__':
    s = Solution()
    result_list = s.threeSum([-1, 0, 1, 2, -1, -4])
    print(result_list)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM