15. 3Sum
題目網址:https://leetcode.cn/problems/3sum/
題意:給一整數 array
nums
, 返回nums
是否存在[nums[i], nums[j], nums[k]]
, 使得nums[i] + nums[j] + nums[k] == 0
, 其中i != j
,i != k
且j != k
。注意:答案中不可包含重複的 tuple。
Solution:
想法:利用 Two Pointers
首先, 將
nums
由小到大做排序
- 用來避免取重複的 tuple, 並可使用 two pointer 來移動 ptr
用
i
遍歷index = [0, n - 3]
, 得到nums[i]
- 為了避免第一次取到與上一輪相同的元素,我們需要在這裡進行一次判斷並跳過
- 使用 Two pointer
left = i + 1
,right = n - 1
尋找滿足條件的 pair- 若
sum < 0
: 則left + 1
- 若
sum > 0
: 則right - 1
- 若
sum == 0
: 則將 tuple 加入到res
中,由於還要檢查剩餘的元素中是否有滿足條件的。因此在加入 tuple 後,left
和right
都需要跳過與當前元素相同的值注意:答案中不可包含重複的 tuple
- 對於第一個元素,我們在判斷時已經確保不會與上一輪相同
- 對於第二和第三個元素,在加入
res
後,我們繼續遍歷剩餘元素時,需要判斷是否與上一個元素相同,如果相同則跳過
cpp
class Solution { |
- time:
➔ + : 排序nums
: for loop 需 , 其中每一個元素用 two ptr 遍歷剩餘元素需
- space:
➔ 若不考慮 output array, 只需常數空間
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Zako's Blog!
評論