leetcode--三數之和(python實現雙指標法)
題目描述:
給你一個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?請你找出所有滿足條件且不重複的三元組。
注意:答案中不可以包含重複的三元組
例子:
給定陣列 nums = [-1, 0, 1, 2, -1, -4],
滿足要求的三元組集合為:
[
[-1, 0, 1],
[-1, -1, 2]
]
思路分析:本題目與之前的兩數之和相似,但是如果用暴力解決的辦法,時間複雜度為O(N^3)而且在leetcode中容易超時,因此本題採用雙指標法。
首先先排除一下特例的情況如陣列的元素長度小於3或者空陣列,在接著對陣列進行排序,如果最小的元素都大於0,不存在三數之和為0。我們將左指標設為i+1,右指標len(nums)-1,如果存在三數之和為0,則左右指標各向右移動,接著需要判斷該數的附近是否有重複,進行去重,各自指標進行移動。如果三數之和大於0,右指標左移,左指標右移。
程式碼展示
class Solution(object):
def threeSum(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
#雙指標法
n=len(nums)
ans=[]
if n<3 or nums==None:
return []
ans=[]
nums.sort()
for i in range(n):
if nums[i]>0:
return ans
if i>0 and nums[i]==nums[i-1]:
continue
L=i+1
R=n-1
while L<R:
if nums[i]+nums[L]+nums[R]==0:
ans.append([nums[i],nums[L],nums[R]])#新增符合要求的元素
while(L<R and nums[L]==nums[L+1]):#判斷左指標附近有無重複元素
L=L+1
while(L<R and nums[R]==nums[R-1]):
R=R-1
L=L+1
R=R-1#右指標往左移動
elif nums[i]+nums[L]+nums[R]>0:
R=R-1
else:
L=L+1
return ans
相關文章
- 雙指標妙解三數之和指標
- 圖解兩數之和:雙指標法圖解指標
- 雙指標法指標
- 指標-矩陣下三角元素之和指標矩陣
- 兩數之和,三數之和,最接近的三數之和,四數之和
- leetcode 題解:python3@ 官方題解_暴力法_雙指標法LeetCodePython指標
- leetcode 11 題解:python3@ 官方題解_暴力法_雙指標法LeetCodePython指標
- python實現多分類評價指標Python指標
- 雙指標指標
- 三數之和
- 巧用指標平臺DataIndex,五步法輕鬆實現指標管理指標AIIndex
- 實現反轉連結串列--遞迴、迭代、雙指標、棧遞迴指標
- 力扣之迴文數(雙指標中的對撞指標公式模板)力扣指標公式
- 57. 三數之和 &&
- 15.三數之和
- 演算法-雙指標演算法指標
- 【數值方法-Python實現】Crout分解+追趕法實現Python
- LeetCode 15.三數之和LeetCode
- LeetCode15.三數之和LeetCode
- LeetCode15. 三數之和LeetCode
- C語言指標(三):陣列指標和字串指標C語言指標陣列字串
- 【LeetCode_344】反轉字串_Python&Java_雙指標解法LeetCode字串PythonJava指標
- 兩數之和,返回陣列下標陣列
- 雙指標法相關的題指標
- 雙指標維護筆記指標筆記
- 雙指標習題:Kalindrome Array指標
- 6.12.雙指標專題指標
- 演算法題:三數之和演算法
- LeetCode - 15. 三數之和 2LeetCode
- (js)leetcode 15. 三數之和JSLeetCode
- Leetcode 611. 有效三角形的個數 (排序後雙指標優化)LeetCode排序指標優化
- 淺析weak指標的實現指標
- c語言實現this指標效果C語言指標
- Hystrix指標視窗實現原理指標
- 指標變數指標變數
- 雙指標演算法基本原理和實踐指標演算法
- 滑動視窗與雙指標指標
- 靈茶山艾府-相向雙指標指標