Skip to content

Commit 4e87445

Browse files
committed
2 parents c10be0d + f231299 commit 4e87445

File tree

24 files changed

+950
-0
lines changed

24 files changed

+950
-0
lines changed

3sum/Gotprgmer.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
// 이전에 투포인터를 활용하여 시도했지만 중복된 값들을 처리하는데 어려움이 있었습니다.
2+
// 그래서 해답을 보았고 새로운 방법으로 풀어보았습니다.
3+
// 서로 다른 i와 j 인덱스를 2중 for문으로 진행하면서
4+
// i와 j사이 수들을 set으로 관리합니다.
5+
// set에 -nums[i]-nums[j]가 존재하면 결과 리스트에 추가합니다.
6+
// 시간복잡도 : O(N^2)
7+
// 공간복잡도 : O(N)
8+
class SolutionGotprgmer {
9+
public List<List<Integer>> threeSum(int[] nums) {
10+
// 결과를 저장할 리스트
11+
List<List<Integer>> result = new ArrayList<>();
12+
Set<Integer> set;
13+
Set<List<Integer>> resultSet = new HashSet<>();
14+
List<Integer> numList;
15+
16+
17+
// 리스트 정렬
18+
Arrays.sort(nums);
19+
for(int i=0;i<nums.length-2;i++){
20+
if (i > 0 && nums[i - 1] == nums[i]) continue;
21+
22+
set = new HashSet<>();
23+
for(int j=i+1;j<nums.length;j++){
24+
int checkNum = nums[i]+nums[j];
25+
if(set.contains(-checkNum)){
26+
numList = new ArrayList<>(Arrays.asList(nums[i], -checkNum, nums[j]));
27+
if(!resultSet.contains(numList)){
28+
result.add(numList);
29+
resultSet.add(numList);
30+
}
31+
}
32+
set.add(nums[j]);
33+
}
34+
}
35+
return result;
36+
}
37+
}

3sum/eunhwa99.java

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import java.util.ArrayList;
2+
import java.util.Arrays;
3+
import java.util.List;
4+
5+
/**
6+
* 문제 풀이
7+
*/
8+
// -4 -1 -1 0 2 2
9+
// p1 p2 p3 sum < 0 -> p2 앞으로
10+
// p1 p2 p3 sum < 0 -> p2 앞으로
11+
// p1 p2 p3 sum < 0 -> p2 앞으로
12+
// p1 p2p3 sum = 0 -> p1 앞으로
13+
// p1 p2 p3 sum = 0 -> p3 값 다른 게 나올 때까지 이동
14+
// p1 p2 p3 sum < 0 -> p2 앞으로 인데, p2 > p3 되므로 p1 앞으로
15+
// p1 p2 p3 sum = 0 반복
16+
17+
/**
18+
* 시간/공간 복잡도
19+
*/
20+
// 시간 복잡도 - 순회 횟수: n + (n-1) + (n-2) + .. => O(N^2)
21+
// 공간 복잡도 - 배열을 정렬하는 데 O(n log n)의 공간 + 결과를 저장하는 answer 리스트는 문제의 요구에 따라 O(k)의 공간 = O(n log n) (배열 정렬을 위한 공간) + O(k) (결과 저장 공간)
22+
23+
class Solution {
24+
public List<List<Integer>> threeSum(int[] nums) {
25+
Arrays.sort(nums); // Sort the array first
26+
List<List<Integer>> answer = new ArrayList<>();
27+
28+
for (int pointer1 = 0; pointer1 < nums.length - 2; pointer1++) {
29+
// pointer1 의 중복 값 skip
30+
if (pointer1 > 0 && nums[pointer1] == nums[pointer1 - 1]) {
31+
continue;
32+
}
33+
34+
int pointer2 = pointer1 + 1; // pointer2 는 pointer1 의 한 칸 앞
35+
int pointer3 = nums.length - 1; // pointer3 는 끝에서 부터
36+
37+
while (pointer2 < pointer3) {
38+
int sum = nums[pointer1] + nums[pointer2] + nums[pointer3];
39+
40+
if (sum < 0) {
41+
pointer2++;
42+
} else if (sum > 0) {
43+
pointer3--;
44+
} else {
45+
// sum == 0
46+
answer.add(Arrays.asList(nums[pointer1], nums[pointer2], nums[pointer3]));
47+
48+
// pointer2 중복 값 제거
49+
while (pointer2 < pointer3 && nums[pointer2] == nums[pointer2 + 1]) {
50+
pointer2++;
51+
}
52+
53+
// pointer3 중복 값 제거
54+
while (pointer2 < pointer3 && nums[pointer3] == nums[pointer3 - 1]) {
55+
pointer3--;
56+
}
57+
58+
// 두 값 모두 move
59+
pointer2++;
60+
pointer3--;
61+
}
62+
}
63+
}
64+
65+
return answer;
66+
}
67+
}
68+
69+

3sum/higeuni.js

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
// complexity
2+
// time: O(n^2)
3+
// - sort: O(n log n)
4+
// - for loop: O(n)
5+
// - while loop: O(n)
6+
// space: O(n)
7+
// - sortedNums: O(n)
8+
// - else : O(1)
9+
10+
var threeSum = function(nums) {
11+
const sortedNums = nums.sort((a, b) => a - b)
12+
const lengthOfArray = nums.length;
13+
const answer = [];
14+
15+
for(let i = 0; i < lengthOfArray; i++ ) {
16+
if (i > 0 && nums[i] === nums[i - 1]) continue;
17+
const target = (-1) * sortedNums[i];
18+
19+
let left = i + 1;
20+
let right = lengthOfArray - 1;
21+
22+
while(left < right) {
23+
const sumOfLeftAndRight = sortedNums[left] + sortedNums[right];
24+
const diff = sumOfLeftAndRight - target;
25+
26+
if( diff > 0 ){
27+
right -= 1;
28+
} else if ( diff < 0 ){
29+
left += 1
30+
} else {
31+
answer.push([sortedNums[i], sortedNums[left], sortedNums[right]]);
32+
// 중복되는 부분을 처리하는 과정에서 계속 fail되어 찾아보니 이렇게 해야 통과되었다.
33+
while(left < right && sortedNums[left] === sortedNums[left + 1]) left ++;
34+
while(left < right && sortedNums[right] === sortedNums[right - 1]) right --;
35+
36+
left++;
37+
right--;
38+
}
39+
}
40+
}
41+
return answer
42+
};
43+

3sum/minji-go.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
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+
*/
8+
class Solution {
9+
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);
13+
}
14+
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);
37+
}
38+
}
39+
return triplets;
40+
}
41+
}

3sum/taewanseoul.ts

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
/**
2+
* 15. 3Sum
3+
* Given an integer array nums, return all the triplets [nums[i], nums[j], nums[k]] such that i != j, i != k, and j != k, and nums[i] + nums[j] + nums[k] == 0.
4+
* Notice that the solution set must not contain duplicate triplets.
5+
*
6+
* https://leetcode.com/problems/3sum/description/
7+
*/
8+
function threeSum(nums: number[]): number[][] {
9+
nums.sort((a, b) => a - b);
10+
const triplets: number[][] = [];
11+
12+
for (let i = 0; i < nums.length - 2; i++) {
13+
if (nums[i] > 0 || nums[i] === nums[i - 1]) {
14+
continue;
15+
}
16+
17+
let low = i + 1;
18+
let high = nums.length - 1;
19+
20+
while (low < high) {
21+
const sum = nums[i] + nums[low] + nums[high];
22+
if (sum < 0) {
23+
low++;
24+
} else if (sum > 0) {
25+
high--;
26+
} else {
27+
triplets.push([nums[i], nums[low], nums[high]]);
28+
29+
while (low < high && nums[low] === nums[low + 1]) {
30+
low++;
31+
}
32+
while (low < high && nums[high] === nums[high - 1]) {
33+
high--;
34+
}
35+
low++;
36+
high--;
37+
}
38+
}
39+
}
40+
41+
return triplets;
42+
}
43+
44+
// O(n^2) time
45+
// O(n) space

climbing-stairs/Gotprgmer.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// dp문제
2+
// i번째 계단을 가려면 i-1번째 계단까지의 경우의 수와 i-2번째 계단까지의 경우의 수를 합친 것
3+
// 시간복잡도 : O(N)
4+
// 공간복잡도 : O(N)
5+
class Solution {
6+
public int climbStairs(int n) {
7+
int[] dp = new int[n+1];
8+
dp[0] = 1;
9+
dp[1] = 1;
10+
for(int i=2;i<n+1;i++){
11+
dp[i] = dp[i-1]+dp[i-2];
12+
}
13+
return dp[n];
14+
15+
}
16+
}

climbing-stairs/eunhwa99.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/**
2+
* 문제 풀이
3+
*/
4+
// n=2 (1,1), (2) -> 2 가지
5+
// n=3 (n=2, 1), (n=1, 2) -> 2 + 1 = 3가지
6+
// n=4 (n=3, 1), (n=2, 2) -> 3 + 2 = 5가지
7+
// n=5 (n=4, 1) , (n=3, 2)
8+
// n=k (n=k-1, 1), (n=k-2, 2)
9+
10+
/**
11+
* 시간/공간 복잡도
12+
*/
13+
// 시간 복잡도: 각 칸을 한 번씩 방문 -> O(n)
14+
// 공간 복잡도: DP 배열 크기 -> O(n)
15+
class Solution {
16+
public int climbStairs(int n) {
17+
int[] cntArray = new int[n + 1];
18+
cntArray[0] = 1;
19+
cntArray[1] = 1;
20+
for (int i = 2; i <= n; ++i) {
21+
cntArray[i] = cntArray[i - 1] + cntArray[i - 2];
22+
}
23+
return cntArray[n];
24+
}
25+
}

climbing-stairs/higeuni.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// complexity
2+
// time: O(n)
3+
// - for loop: O(n)
4+
// space: O(1)
5+
// - n에 관계없이 상수개의 변수만 사용되므로 O(1)
6+
7+
var climbStairs = function(n) {
8+
let num1 = 1;
9+
let num2 = 1;
10+
let temp = 0;
11+
12+
for(let i = 2; i<=n; ++i ) {
13+
temp = num2;
14+
num2 = num1 + num2;
15+
num1 = temp;
16+
}
17+
18+
return num2;
19+
};
20+

climbing-stairs/minji-go.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/*
2+
Problem: https://leetcode.com/problems/climbing-stairs/
3+
Description: how many distinct ways can you climb to the top, if you can either climb 1 or 2 steps
4+
Concept: Dynamic Programming, Memoization, Recursion, Math, Array, Iterator, Combinatorics ...
5+
Time Complexity: O(n), Runtime: 0ms
6+
Space Complexity: O(1), Memory: 40.63MB
7+
*/
8+
class Solution {
9+
public int climbStairs(int n) {
10+
if(n==1) return 1;
11+
if(n==2) return 2;
12+
13+
int prev=1, cur=2;
14+
for(int i=3; i<=n; i++){
15+
int next=prev+cur;
16+
prev=cur;
17+
cur=next;
18+
}
19+
return cur;
20+
}
21+
}

climbing-stairs/taewanseoul.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/**
2+
* 70. Climbing Stairs
3+
* You are climbing a staircase. It takes n steps to reach the top.
4+
* Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?
5+
*
6+
* https://leetcode.com/problems/climbing-stairs/description/
7+
*/
8+
function climbStairs(n: number): number {
9+
if (n <= 2) {
10+
return n;
11+
}
12+
13+
let prev = 1;
14+
let cur = 2;
15+
16+
for (let i = 3; i < n + 1; i++) {
17+
const next = prev + cur;
18+
prev = cur;
19+
cur = next;
20+
}
21+
22+
return cur;
23+
}
24+
25+
// O(n) time
26+
// O(1) space

0 commit comments

Comments
 (0)