日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Python三數之和的實現方式_python

作者:每天收獲一點點 ? 更新時間: 2022-07-04 編程語言

三數之和題目描述

給你一個包含 n 個整數的數組 nums,判斷 nums 中是否存在三個元素 a,b,c ,

使得 a + b + c = 0 ?請你找出所有滿足條件且不重復的三元組。

答案中不允許包含重復的三元組。

示例:

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

滿足要求的三元組集合為:

[
? [-1, 0, 1],
? [-1, -1, 2]
]

思路

1. 首先將數組排序,可以利用Python內置函數,也可以利用另外定義排序算法。

2. 應用雙指針算法。固定第一個數,索引為i,遍歷整個數組,第一個數也是三個數中最小的數,然后在該數右面設置左右兩個指針l和r,l=i+1,r=len(nums)-1,

3. 判斷這三個索引指向的元素和與0的大小關系。

和>0,右指針左移一位;和<0,左指針右移一位。

由于要避免重復的三元組,所以移動左右指針的時候要跳過相鄰的所有相等的nums[i]。

Python3代碼

#導入計算時間的包,調用系統時間
from time import * 
#初始時間
t1 = time()
def threeSum(nums):
    nums.sort()
    n = len(nums)
    res = []
    for i in range(n):
        '''如果相鄰的兩個數相等,跳過,避免重復'''
        if i > 0 and nums[i] == nums[i-1]:
            continue 
        l, r = i+1, n-1
        while l < r:
            if nums[i] + nums[l] + nums[r]>0:
                r -= 1
                while nums[r+1] == nums[r]:
                    r -= 1
            elif nums[i] + nums[l] + nums[r]<0:
                l += 1
                while nums[l-1] == nums[l]:
                    l += 1    
            else:
                res.append([nums[i],nums[l],nums[r]])
                l += 1
                r -= 1
                while nums[l] == nums[l - 1]: l += 1
                while nums[r] == nums[r + 1]: r -= 1
    return res
        
if __name__ == '__main__':
    nums = [-1,0,1,2,-1,-4]
    print(threeSum(nums))
#結束時間
t2 = time()
#運行時間
run_time = t2 - t1
print(run_time)

運行結果:

[[-1, -1, 2], [-1, 0, 1]]
#運行時間
0.0010113716125488281

以上代碼有一些思想錯誤:

遺漏了如果三個數全部大于0,則退出循環,因為沒有滿足條件的結果。

沒有嚴格判斷每一次的l<r的條件。

修正后的代碼:

from time import * 
t1 = time()
def threeSum(nums):
    nums.sort()
    n = len(nums)
    res = []
    for i in range(n-2):
        if nums[i] > 0:break
        '''如果相鄰的兩個數相等,跳過,避免重復'''
        if i > 0 and nums[i] == nums[i-1]:
            continue 
        l, r = i+1, n-1
        while l < r:
            if nums[i] + nums[l] + nums[r]>0:
                r -= 1
                while l < r and nums[r-1] == nums[r]:
                    r -= 1
            elif nums[i] + nums[l] + nums[r]<0:
                l += 1
                while l < r and nums[l] == nums[l-1]:
                    l += 1    
            else:
                res.append([nums[i],nums[l],nums[r]])
                l += 1
                r -= 1
                while l < r and nums[l] == nums[l - 1]: l += 1
                while l < r and nums[r] == nums[r + 1]: r -= 1
    return res
        
if __name__ == '__main__':
    nums = [-2,-3,0,0,-2]
    print(threeSum(nums))
t2 = time()
run_time = t2 - t1
print(run_time)

結果:

[]
#時間
0.0

原文鏈接:https://blog.csdn.net/weixin_43937698/article/details/110697815

欄目分類
最近更新