力扣:15三数之和(python)
生活随笔
收集整理的這篇文章主要介紹了
力扣:15三数之和(python)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
class Solution(object):def threeSum(self, nums):# 1.當nums的長度小于3的時候,直接返回[]if len(nums) < 3:return []# 2.將nums分成三組:zeros,positives,negatives(零,正數,負數)zeros, positives, negatives = 0, {}, {}# 3.統計nums中每個數字出現的次數for num in nums:if num == 0:zeros += 1elif num > 0:positives.setdefault(num, 0)positives[num] += 1else:negatives.setdefault(num, 0)negatives[num] += 1# 4.相加為0的三元組可能的組成形式:3個0,兩個負數一個正數,兩個正數一個負數,一正一負加一零results = []# 5.當0的個數多余3個時,向result中添加【0,0,0】if zeros >= 3:results.append([0] * 3)# 6.當正數或者負數的個數為0時,直接返回resultif len(positives) == 0 and len(negatives) == 0:return resultselse:# 7.遍歷所有的正整數for pi in positives:# 8.獲取pi這個正整數在nums的個數count = positives[pi]# 9.如果pi的個數大于2個,并且-2*pi在負數集中, 即(pi+pi-2pi=0),所以向result中添加【pi,pi,-2pi]if count >= 2 and (-2 * pi) in negatives:results.append([pi] * 2 + [-2 * pi])# 10.如果-pi在負數集中,并且nums中有0,即(pi-pi+0=0),所以向result中添加【pi,-pi,0]if -pi in negatives and zeros > 0:results.append([pi, -pi, 0])# 11.尋找兩正一負的結果for pj in positives:# 12.這一步是為了防止向result中添加相同的結果,例如:[-1,-1,2]和[2,-1,-1]是算同一個三元組if pj <= pi:continueif -1 * (pi + pj) in negatives:results.append([-1 * (pi + pj), pi, pj])# 13.這里和上面的原理是一樣的for ni in negatives:count = negatives[ni]if count >= 2 and (-2 * ni) in positives:results.append([ni] * 2 + [-2 * ni])for nj in negatives:if nj <= ni:continueif -1 * (ni + nj) in positives:results.append([-1 * (ni + nj), ni, nj])return results
總結
以上是生活随笔為你收集整理的力扣:15三数之和(python)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 力扣:11盛水最多的容器
- 下一篇: 力扣:12正数转罗马数字(python)