LeetCode15. 三數之和
學習雙指標的運用
方法一:暴力解法(三個迴圈)
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
nums.sort()
result = []
for i in range(len(nums)):
for j in range(i+1, len(nums)):
for k in range(j+1, len(nums)):
if nums[i] + nums[j] + nums[k] == 0 and [nums[i], nums[j], nums[k]] not in result:
result.append([nums[i], nums[j], nums[k]])
return result
超出時間限制
方法二:排序 + 雙指標
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
# 先排序,為了判斷是否重複
nums.sort()
result = []
for i in range(len(nums)):
# 對於每一重迴圈而言,相鄰兩次列舉的元素不能相同,否則也會造成重複
if i == 0 or nums[i] != nums[i-1]:
# 第三重迴圈對應的指標
k = len(nums) - 1
for j in range(i+1, len(nums)):
if j == i+1 or nums[j] != nums[j-1]:
# 需要保證j在k的左側
while nums[i] + nums[j] + nums[k] > 0 and j<k:
k -= 1
# 如果指標重合,隨著 b 後續的增加,就不會有滿足 a+b+c=0 並且 b<c 的 c 了,可以退出迴圈
if j == k:
break
if nums[i] + nums[j] + nums[k] == 0:
result.append([nums[i], nums[j], nums[k]])
return result
複雜度分析
- 時間複雜度: O ( N 2 ) O(N^2) O(N2),其中 N N N 是陣列 nums \textit{nums} nums 的長度。
- 空間複雜度: O ( log N ) O(\log N) O(logN)。我們忽略儲存答案的空間,額外的排序的空間複雜度為 O ( log N ) O(\log N) O(logN)。然而我們修改了輸入的陣列 nums \textit{nums} nums,在實際情況下不一定允許,因此也可以看成使用了一個額外的陣列儲存了 nums \textit{nums} nums的副本並進行排序,空間複雜度為 O ( N ) O(N) O(N)。
相關文章
- LeetCode15.三數之和LeetCode
- 演算法題:三數之和演算法
- 雙指標妙解三數之和指標
- LeetCode 15.三數之和LeetCode
- 15. 三數之和_(c語言版)C語言
- LeetCode - 15. 三數之和 2LeetCode
- (js)leetcode 15. 三數之和JSLeetCode
- 演算法之陣列——三數之和演算法陣列
- [LeetCode] 3Sum 三數之和LeetCode
- 力扣.16 最接近的三數之和力扣
- [陣列]Leetcode15三數之和陣列LeetCode
- 程式碼隨想錄演算法訓練營第七天 | 四數之和、贖金信、三數之和、四數之和2演算法
- 兩數之和
- Day 7| 454.四數相加II 、383. 贖金信 、15. 三數之和 、18. 四數之和
- LeetCode筆記-三數之和等於0LeetCode筆記
- 【LeetCode(Java) - 259】較小的三數之和LeetCodeJava
- [LeetCode] 3Sum Closest 最近三數之和LeetCode
- day7雜湊表 454.四數相加II |383. 贖金信|15. 三數之和 |18. 四數之和
- 讓我們一起啃演算法----三數之和演算法
- 1. 兩數之和
- 18_四數之和
- 輸入一個三位數,輸出它各個數位之和
- LeetCode:兩數之和LeetCode
- LeetCode - 兩數之和LeetCode
- 演算法-兩數之和演算法
- 兩數之和詳細解答
- leetcode--三數之和(python實現雙指標法)LeetCodePython指標
- LeetCode 1 兩數之和LeetCode
- leetcode #1 兩數之和LeetCode
- LeetCode之兩數之和LeetCode
- 雜湊查詢 兩數之和
- abc172D 約數之和
- AcWing871. 約數之和
- LeetCode-兩數之和LeetCode
- Hash表實踐 —— 兩數之和
- 數字之魅:子陣列之和的最大值[二維]+[三維]陣列
- 程式碼隨想錄演算法訓練營day07|454.四數相加II,383.贖金信,15.三數之和,18.四數之和演算法
- LeetCode: Two sum(兩數之和)LeetCode