Skip to content

Commit 5f013cd

Browse files
authored
Merge branch 'DaleStudy:main' into week3
2 parents 3de33f6 + 11b33a3 commit 5f013cd

File tree

218 files changed

+6985
-137
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

218 files changed

+6985
-137
lines changed

3sum/YoungSeok-Choi.java

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import java.util.ArrayList;
2+
import java.util.Arrays;
3+
import java.util.Collections;
4+
import java.util.HashSet;
5+
import java.util.List;
6+
import java.util.Set;
7+
8+
// NOTE: 실행시간 1.5초..
9+
// 시간 복잡도: O(n^2)
10+
class Solution {
11+
public List<List<Integer>> threeSum(int[] nums) {
12+
13+
Arrays.sort(nums);
14+
Set<List<Integer>> result = new HashSet<>();
15+
16+
for(int i = 0; i < nums.length - 2; i++) {
17+
int startIdx = i + 1;
18+
int endIdx = nums.length - 1;
19+
while(startIdx < endIdx) {
20+
int sum = nums[i] + nums[startIdx] + nums[endIdx];
21+
if(sum == 0) {
22+
result.add(Arrays.asList(nums[i], nums[startIdx], nums[endIdx]));
23+
}
24+
25+
if(sum > 0) {
26+
endIdx--;
27+
} else {
28+
startIdx++;
29+
}
30+
}
31+
}
32+
33+
return new ArrayList<>(result);
34+
}
35+
}
36+
37+
38+
39+
// 309 / 314 testcases passed Time Limit Exceeded
40+
// NOTE: 시간복잡도 O(n^3)
41+
class WrongSolution {
42+
public List<List<Integer>> threeSum(int[] nums) {
43+
Set<List<Integer>> res = new HashSet<>();
44+
45+
List<Integer> temp = new ArrayList<>();
46+
47+
temp.remove(3);
48+
49+
for(int i = 0; i < nums.length; i++) {
50+
for(int j = 0; j < i; j++) {
51+
for(int k = 0; k < j; k++) {
52+
53+
if((nums[i] + nums[j] + nums[k]) == 0) {
54+
List<Integer> solution = Arrays.asList(nums[i], nums[j], nums[k]);
55+
Collections.sort(solution);
56+
res.add(solution);
57+
}
58+
}
59+
}
60+
}
61+
62+
63+
return new ArrayList<>(res);
64+
}
65+
}

3sum/ayleeee.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# 투포인터를 활용해보기
2+
3+
def threeSum(self, nums: List[int]) -> List[List[int]]:
4+
n = len(nums)
5+
nums.sort()
6+
result = set()
7+
for i in range(n):
8+
l,r = i+1,n-1
9+
while l<r:
10+
res = nums[i] + nums[l] + nums[r]
11+
if res < 0:
12+
l += 1
13+
elif res > 0:
14+
r -= 1
15+
else:
16+
result.add((nums[i], nums[l], nums[r]))
17+
l += 1
18+
return list(result)
19+

3sum/doitduri.swift

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import Foundation
2+
3+
class Solution {
4+
func threeSum(_ nums: [Int]) -> [[Int]] {
5+
var result = [[Int]]()
6+
let sortedNums = nums.sorted()
7+
8+
for i in 0..<sortedNums.count - 2 {
9+
if i > 0 && sortedNums[i] == sortedNums[i - 1] {
10+
continue
11+
}
12+
13+
var leftNumber = i + 1
14+
var rightNumber = sortedNums.count - 1
15+
16+
while leftNumber < rightNumber {
17+
let sum = sortedNums[i] + sortedNums[leftNumber] + sortedNums[rightNumber]
18+
19+
if sum < 0 {
20+
leftNumber += 1
21+
} else if sum > 0 {
22+
rightNumber -= 1
23+
} else {
24+
result.append([sortedNums[i], sortedNums[leftNumber], sortedNums[rightNumber]])
25+
26+
while leftNumber < rightNumber && sortedNums[leftNumber] == sortedNums[leftNumber + 1] {
27+
leftNumber += 1
28+
}
29+
30+
while leftNumber < rightNumber && sortedNums[rightNumber] == sortedNums[rightNumber - 1] {
31+
rightNumber -= 1
32+
}
33+
34+
leftNumber += 1
35+
rightNumber -= 1
36+
}
37+
}
38+
}
39+
40+
return result
41+
}
42+
}
43+

3sum/haung921209.md

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
```cpp
2+
class Solution {
3+
public:
4+
vector<vector<int>> threeSum(vector<int>& nums) {
5+
sort(nums.begin(), nums.end());
6+
set<vector<int>> res;
7+
for(int i=0;i<nums.size();i++){
8+
int l = i+1, r = nums.size()-1;
9+
10+
while(l<r){
11+
int sum = nums[i]+nums[l]+nums[r];
12+
13+
if(sum<0){
14+
l++;
15+
}else if(sum>0){
16+
r--;
17+
}else{
18+
res.insert({nums[i], nums[l], nums[r]});
19+
l++;
20+
r--;
21+
}
22+
}
23+
}
24+
25+
return vector<vector<int>>(res.begin(), res.end());
26+
}
27+
};
28+
```
29+
30+
- set -> vector 사용 이유는 중복 제거를 위함
31+
32+
```cpp
33+
class Solution {
34+
public:
35+
vector<vector<int>> threeSum(vector<int>& nums) {
36+
sort(nums.begin(), nums.end());
37+
set<vector<int>> res;
38+
for(int i=0;i<nums.size();i++){
39+
if(i != 0 && nums[i] == nums[i-1]) continue;
40+
41+
int l = i+1, r = nums.size()-1;
42+
43+
while(l<r){
44+
int sum = nums[i]+nums[l]+nums[r];
45+
46+
if(sum<0){
47+
l++;
48+
}else if(sum>0){
49+
r--;
50+
}else{
51+
res.insert({nums[i], nums[l], nums[r]});
52+
l++;
53+
r--;
54+
}
55+
}
56+
}
57+
58+
return vector<vector<int>>(res.begin(), res.end());
59+
60+
}
61+
};
62+
```
63+
64+
- `if(i != 0 && nums[i] == nums[i-1]) continue;` 를 통한 탐색 범위 줄이기 최적화 정도의 차이로 상 / 하위 갈리는 정도
65+
- 단순 2 pointer로 처리해도 무방
66+
67+

3sum/hi-rachel.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# O(n^2) time, O(n) space
2+
3+
class Solution:
4+
def threeSum(self, nums: List[int]) -> List[List[int]]:
5+
triplets = set()
6+
7+
for i in range(len(nums) - 2):
8+
seen = set()
9+
for j in range(i + 1, len(nums)):
10+
complement = -(nums[i] + nums[j])
11+
if complement in seen:
12+
triplet = [nums[i], nums[j], complement]
13+
triplets.add(tuple(sorted(triplet)))
14+
seen.add(nums[j])
15+
16+
return list(triplets)

3sum/hoyeongkwak.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/*
2+
time complexity : O(n^2)
3+
space complexity : O(1)
4+
*/
5+
function threeSum(nums: number[]): number[][] {
6+
const result: number[][] = []
7+
const sortedNums = nums.sort((a, b) => a - b)
8+
9+
for(let i = 0; i < sortedNums.length - 2; i++) {
10+
if (i > 0 && sortedNums[i] === sortedNums[i - 1]) continue
11+
let low = i + 1
12+
let high = sortedNums.length - 1
13+
while (low < high) {
14+
const threeSum = sortedNums[i] + sortedNums[low] + sortedNums[high]
15+
if (threeSum < 0) {
16+
low += 1
17+
} else if (threeSum > 0) {
18+
high -= 1
19+
} else {
20+
result.push([sortedNums[i], sortedNums[low], sortedNums[high]])
21+
while (low < high && sortedNums[low] === sortedNums[low + 1]) low++
22+
while (low < high && sortedNums[high] === sortedNums[high - 1]) high--
23+
24+
low += 1
25+
high -= 1
26+
}
27+
}
28+
}
29+
return result
30+
}

3sum/krokerdile.py

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
class Solution:
2+
def threeSum(self, nums: List[int]) -> List[List[int]]:
3+
nums.sort()
4+
res = []
5+
n = len(nums)
6+
7+
for i in range(n):
8+
if i > 0 and nums[i] == nums[i-1]:
9+
continue
10+
11+
target = -nums[i]
12+
seen = set()
13+
j = i + 1
14+
15+
while j < n:
16+
complement = target - nums[j]
17+
if complement in seen:
18+
res.append([nums[i], complement, nums[j]])
19+
while j + 1 < n and nums[j] == nums[j+1]:
20+
j += 1
21+
seen.add(nums[j])
22+
j += 1
23+
return list(set(tuple(x) for x in res))
24+
25+
26+
class Solution:
27+
def threeSum(self, nums: List[int]) -> List[List[int]]:
28+
nums.sort()
29+
result = []
30+
31+
for i in range(len(nums)):
32+
# 중복된 첫 번째 수는 skip
33+
if i > 0 and nums[i] == nums[i - 1]:
34+
continue
35+
36+
left, right = i + 1, len(nums) - 1
37+
38+
while left < right:
39+
total = nums[i] + nums[left] + nums[right]
40+
41+
if total == 0:
42+
result.append([nums[i], nums[left], nums[right]])
43+
44+
# 중복된 두 번째, 세 번째 수 건너뛰기
45+
while left < right and nums[left] == nums[left + 1]:
46+
left += 1
47+
while left < right and nums[right] == nums[right - 1]:
48+
right -= 1
49+
50+
left += 1
51+
right -= 1
52+
53+
elif total < 0:
54+
left += 1 # 합이 작으면 왼쪽을 오른쪽으로
55+
else:
56+
right -= 1 # 합이 크면 오른쪽을 왼쪽으로
57+
58+
return result

3sum/minji-go.java

Lines changed: 22 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,30 @@
1-
/*
2-
Problem: https://leetcode.com/problems/3sum/
3-
Description: return all the triplets (i != j, i != k, and j != k, and nums[i] + nums[j] + nums[k] == 0)
4-
Concept: Array, Two Pointers, Sorting
5-
Time Complexity: O(N²), Runtime 70ms
6-
Space Complexity: O(N), Memory 51.63MB
7-
*/
1+
/**
2+
* <a href="https://leetcode.com/problems/3sum/">week02-4.3sum</a>
3+
* Description: return all the triplets (i != j, i != k, and j != k, and nums[i] + nums[j] + nums[k] == 0)
4+
* Concept: Array, Two Pointers, Sorting
5+
* Time Complexity: O(N²), Runtime 2021ms
6+
* Space Complexity: O(N), Memory 53.9MB
7+
*/
8+
89
class Solution {
910
public List<List<Integer>> threeSum(int[] nums) {
10-
Map<Integer, Integer> number = new HashMap<>();
11-
for(int i=0; i<nums.length; i++) {
12-
number.put(nums[i], number.getOrDefault(nums[i], 0)+1);
11+
Map<Integer, Integer> map = new HashMap<>();
12+
for(int i=0; i<nums.length; i++){
13+
map.put(nums[i], i);
1314
}
1415

15-
Arrays.sort(nums);
16-
Set<List<Integer>> set = new HashSet<>();
17-
List<List<Integer>> triplets = new ArrayList<>();
18-
List<Integer> lastTriplet = null;
19-
for(int i=0; i<nums.length-1; i++) {
20-
if(i>0 && nums[i]==nums[i-1]) continue;
21-
22-
for(int j=i+1; j<nums.length; j++){
23-
if(j>i+1 && nums[j]==nums[j-1]) continue;
24-
25-
int target = -(nums[i]+nums[j]);
26-
if(nums[j]>target) continue;
27-
28-
int count = number.getOrDefault(target,0);
29-
if(nums[i]==target) count--;
30-
if(nums[j]==target) count--;
31-
if(count<=0) continue;
32-
33-
List<Integer> triplet = List.of(nums[i], nums[j], target);
34-
if(triplet.equals(lastTriplet)) continue;
35-
lastTriplet = triplet;
36-
triplets.add(triplet);
16+
Set<List<Integer>> triplets = new HashSet<>();
17+
for(int i=0; i<nums.length-2; i++){
18+
for(int j=i+1; j<nums.length-1; j++){
19+
int sum = nums[i]+nums[j];
20+
if(map.containsKey(-sum) && map.get(-sum) > j){
21+
List<Integer> list = Arrays.asList(nums[i],nums[j],-sum);
22+
Collections.sort(list);
23+
triplets.add(list);
24+
}
3725
}
3826
}
39-
return triplets;
27+
28+
return new ArrayList<>(triplets);
4029
}
4130
}

3sum/paran22.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
class Solution:
2+
# time complexity: O(n^2)
3+
def threeSum(self, nums: List[int]) -> List[List[int]]:
4+
nums.sort()
5+
answer = set()
6+
7+
for i in range(len(nums) - 2):
8+
if i > 0 and nums[i] == nums[i - 1]:
9+
continue
10+
11+
left, right = i + 1, len(nums) - 1
12+
while left < right:
13+
sum = nums[i] + nums[left] + nums[right]
14+
if sum == 0:
15+
answer.add((nums[i], nums[left], nums[right]))
16+
left += 1
17+
right -= 1
18+
elif sum > 0:
19+
right -= 1
20+
elif sum < 0:
21+
left += 1
22+
23+
return [list(x) for x in answer]
24+

0 commit comments

Comments
 (0)