μμ μ νμ΄λ΄€λ λ¬Έμ μμ΄μ μ κ·Όλ²μ μκ³ μμλ€.
- μ λ ¬μ νμ¬ λ°°μ΄μ λμκ΄κ³λ₯Ό μΌμ νκ² νλ€.
- i,j,kλ₯Ό μ€μ ν΄μΌ νλλ°, i < j < kμ΄λλ‘ νλ€.
- iλ 맨 μμμλΆν° μννλ€.
- jλ iμ λ€λΆν° μννλ€.
- kλ 맨 λ€μμλΆν° μννλ€.
- μΈ μΈλ±μ€κ° κ°λ¦¬ν€λ κ°λ€μ ν©μ λΉκ΅νμ¬ jμ kλ₯Ό μμ νλ€.
-
Time complexity:
$$O(n^2)$$ - μ
λ ₯ λ°°μ΄μ κΈΈμ΄ nμ λνμ¬,
i,jμ kλ₯Ό μννλ€.
- μ
λ ₯ λ°°μ΄μ κΈΈμ΄ nμ λνμ¬,
-
Space complexity:
$$O(n)$$ - μ λ ₯μΌλ‘ λ€μ΄μ¨ λ°°μ΄μ κΈΈμ΄ nμ λνμ¬, μμ±νλ κ²°κ³Ό λ°°μ΄μ κΈΈμ΄ μμ μ΄μ λμΌνλ€.
func update(i int, j int, k int, sum int, nums []int) (int, int) {
if sum <= 0 {
j++
for j < len(nums) && j >= 1 && nums[j] == nums[j-1] {
j++
}
} else {
k--
for k >= 0 && k+1 < len(nums) && nums[k] == nums[k+1] {
k--
}
}
return j, k
}
func threeSum(nums []int) [][]int {
var triplets [][]int
sort.Ints(nums)
for i := 0; i < len(nums); i++ {
j, k := i+1, len(nums)-1
if i != 0 && nums[i-1] == nums[i] {
continue
}
for j < k {
sum := nums[i] + nums[j] + nums[k]
if sum == 0 {
triplets = append(triplets, []int{nums[i], nums[j], nums[k]})
}
j, k = update(i, j, k, sum, nums)
}
}
return triplets
}