Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 37 additions & 0 deletions 3sum/DaleSeo.rs

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🏷️ 알고리즘 패턴 분석

  • 패턴: Two Pointers, Sorting
  • 설명: 주어진 코드는 정렬 후 두 포인터(low, high)를 이용해 가능한 3합을 찾아내는 구조로, 중복 제거를 위한 건너뛰기 로직도 포함되어 있습니다. 이는 Two Pointers 패턴의 대표적인 예시이며, 정렬 후 탐색 공간을 절약하는 전략입니다.

📊 시간/공간 복잡도 분석

유저 분석 실제 분석 결과
Time O(n^2) O(n^2)
Space O(1) O(1)

피드백: 정렬 O(n log n) 이후 이중 루프와 투 포인터로 총 O(n^2) 시간으로 3합 탐색. 중복 제거를 잘 처리하고 있다.

개선 제안: 현재 구현이 적절해 보입니다.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아 이렇게 왼쪽에 포인터를 두고 오른쪽으로 이동하면서
오른쪽에 위치한 부분배열의 left/right 포인터로 접근하는 방법도 있겠네요

Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
// TC: O(n^2)
// SC: O(1)
impl Solution {
pub fn three_sum(mut nums: Vec<i32>) -> Vec<Vec<i32>> {
nums.sort_unstable();
let n = nums.len();
let mut triplets = Vec::new();

for i in 0..n {
if i > 0 && nums[i] == nums[i - 1] {
continue;
}

let (mut low, mut high) = (i + 1, n - 1);
while low < high {
let three_sum = nums[i] + nums[low] + nums[high];
if three_sum < 0 {
low += 1;
} else if three_sum > 0 {
high -= 1;
} else {
triplets.push(vec![nums[i], nums[low], nums[high]]);
low += 1;
high -= 1;
while low < high && nums[low] == nums[low - 1] {
low += 1;
}
while low < high && nums[high] == nums[high + 1] {
high -= 1;
}
}
}
}

triplets
}
}
Loading