Skip to content

Latest commit

Β 

History

History
59 lines (49 loc) Β· 1.35 KB

File metadata and controls

59 lines (49 loc) Β· 1.35 KB

Intuition

μ˜ˆμ „μ— ν’€μ–΄λ΄€λ˜ λ¬Έμ œμ˜€μ–΄μ„œ 접근법을 μ•Œκ³ μžˆμ—ˆλ‹€.

Approach

  1. 정렬을 ν•˜μ—¬ λ°°μ—΄μ˜ λŒ€μ†Œκ΄€κ³„λ₯Ό μΌμ •ν•˜κ²Œ ν•œλ‹€.
  2. i,j,kλ₯Ό μ„€μ •ν•΄μ•Ό ν•˜λŠ”λ°, i < j < k이도둝 ν•œλ‹€.
  3. iλŠ” 맨 μ•žμ—μ„œλΆ€ν„° μˆœνšŒν•œλ‹€.
  4. jλŠ” i의 λ’€λΆ€ν„° μˆœνšŒν•œλ‹€.
  5. kλŠ” 맨 λ’€μ—μ„œλΆ€ν„° μˆœνšŒν•œλ‹€.
  6. μ„Έ μΈλ±μŠ€κ°€ κ°€λ¦¬ν‚€λŠ” κ°’λ“€μ˜ 합을 λΉ„κ΅ν•˜μ—¬ j와 kλ₯Ό μˆ˜μ •ν•œλ‹€.

Complexity

  • Time complexity: $$O(n^2)$$

    • μž…λ ₯ λ°°μ—΄μ˜ 길이 n에 λŒ€ν•˜μ—¬, i, j와 kλ₯Ό μˆœνšŒν•œλ‹€.
  • Space complexity: $$O(n)$$

    • μž…λ ₯으둜 λ“€μ–΄μ˜¨ λ°°μ—΄μ˜ 길이 n에 λŒ€ν•˜μ—¬, μƒμ„±ν•˜λŠ” κ²°κ³Ό λ°°μ—΄μ˜ 길이 μ—­μ‹œ 이와 λ™μΌν•˜λ‹€.

Code

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
}