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後,我們繼續遍歷剩餘元素時,需要判斷是否與上一個元素相同,如果相同則跳過
class Solution { |
- time:$O(n^2)$ ➔ $O(n \cdot log(n))$ + $O(n^2)$
- $O(n \cdot log(n))$ : 排序
nums - $O(n^2)$ : for loop 需 $O(n)$, 其中每一個元素用 two ptr 遍歷剩餘元素需 $O(n)$
- $O(n \cdot log(n))$ : 排序
- space:$O(1)$ ➔ 若不考慮 output array, 只需常數空間
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Zako's Blog!
評論