Python|雙指針解決三數之和問題

歡迎點擊「算法與編程之美」↑關注我們!

本文首發於微信公衆號:"算法與編程之美",歡迎關注,及時瞭解更多此係列文章。

歡迎加入團隊圈子!與作者面對面!直接點擊!

問題描述

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

例如:nums=[-1,0,1,2,-1,-4]

輸出:

[

[-1,0,1 ]

[-1,-1,2]

]

時間限制:48ms

解決方案

對於數組中數字組合的問題,最簡單的方法就是遍歷所有情況,然後將滿足情況的組合輸出。這道題的大致思路也是這樣,但是還需要注意,本題要組合三個數字,如果採取for循環,需要三個這樣的循環,時間複雜度是很高的,同時還遍歷了很多重複項,耗時會很大,所以爲滿足題目的時間限制,這裏介紹優於多層for循環的解題方法——雙指針。

雙指針思路:採取左右兩個指針代替兩個for循環,在第一層循環下調節指針的位置,設置判斷條件就可以排除很多重複項和不滿足條件的組合,最終得到滿足題目的三元組。

Python代碼

def threeSum(nums):

        '''

        算法思路:最外層控制一個元素的循環,內層用雙指針,一個從頭到尾掃描,另一個從尾到頭掃描,判斷三個元素的值之和是否爲零       

        注意:相同的元素需要跳過

        '''

        nums.sort()# 對列表進行排序

        res = []

        k=0

        for k in range(len(nums) - 2):

            # 如果出現最小元素爲正數,則不存在和爲0的情況,直接返回

            if nums[k] > 0:

                break

            # 如果出現第一個元素重複的情況,爲避免重複結果,跳過後續執行

            if k > 0 and nums[k] == nums[k - 1]:

                continue

            # 定義接下來的兩個元素的雙指針

            i, j = k + 1, len(nums) - 1

            while i < j:

                s = nums[k] + nums[i] + nums[j]

                if s < 0:

                    i += 1

                    # 跳過重複元素

                    while i < j and nums[i] == nums[i - 1]:

                        i += 1

                elif s > 0:

                    j -= 1

                    # 跳過重複元素

                    while i < j and nums[j] == nums[j + 1]:

                        j -= 1

                else:

                    # 當出現元素滿足條件時,將結果加入到列表

                    res.append([nums[k], nums[i], nums[j]])

                    # 接着更新索引(注意跳過相同元素)

                    i += 1

                    j -= 1

                    while i < j and nums[i] == nums[i - 1]:

                        i += 1

                    while i < j and nums[j] == nums[j + 1]:

                        j -= 1

        return res

思路推廣

雙指針廣泛用於求數組中滿足一定條件的元素組合案例,該思路最大的特點就是減少循環的次數和方便去除重複項,從而減少代碼耗時,優化代碼。

 

END

主  編   |   王文星

責  編   |   饒龍江

 where2go 團隊


   

微信號:算法與編程之美          

長按識別二維碼關注我們!

溫馨提示:點擊頁面右下角“寫留言”發表評論,期待您的參與!期待您的轉發!

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