歡迎點擊「算法與編程之美」↑關注我們!
本文首發於微信公衆號:"算法與編程之美",歡迎關注,及時瞭解更多此係列文章。
歡迎加入團隊圈子!與作者面對面!直接點擊!
問題描述
給定一個包含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 團隊
微信號:算法與編程之美
長按識別二維碼關注我們!
溫馨提示:點擊頁面右下角“寫留言”發表評論,期待您的參與!期待您的轉發!