•̀ω•́)つ
嗨,我是wec,今天是DAY 16。
給定一個包含n
個整數的數組nums
,判斷是否存在三個數字,使它們的和為0。找出所有不重複的三元組。
第1步: 先對nums
做排序,然後使用變數i
從 0 遍歷到 n-2。對於每個i
,把nums[i]
當作基準數。如果nums[i]
與前一個元素相同則跳過,避免重複。
第2步: 定義兩個指針,left
指向 i + 1,right
指向 n - 1。如果三個數字和為0則記錄下來並調整left
和right
(跳過重複的元素)。
第3步: 如果和小於 0,移動left
向右。如果和大於 0,移動right
向左。兩者相遇時停止。
程式碼:
def three_sum(nums)
nums.sort!
result = []
nums.each_with_index do |num, i|
next if i > 0 && num == nums[i - 1]
left, right = i + 1, nums.length - 1
while left < right
sum = num + nums[left] + nums[right]
if sum == 0
result << [num, nums[left], nums[right]]
left += 1
right -= 1
left += 1 while left < right && nums[left] == nums[left - 1]
right -= 1 while left < right && nums[right] == nums[right + 1]
elsif sum < 0
left += 1
else
right -= 1
end
end
end
result
end
雙指針: 時間複雜度為O(n²),n為組數長度。
➡️ 這種方法的應用其實很廣泛,尤其在需要從大量資料中尋找匹配對象時,都可以考慮通過排序+雙指針來節省時間。例如在檢查文件夾大小、尋找一組數值的匹配等問題中,也可以用相似的思維來優化演算法喔! /ᐠ-˕-マⳊ
那麽,以上就是今天的內容!
相信IT人動腦時都要吃點東西,所以今天邊寫邊吃水蜜桃果凍。
明天要說:Ruby精選刷題!Medium路跑D-9(>∀・)⌒☆