Skip to content

Commit b6efc89

Browse files
committed
Merge remote-tracking branch 'origin/main'
2 parents 261ed80 + 70c9b19 commit b6efc89

File tree

87 files changed

+3315
-1
lines changed

Some content is hidden

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

87 files changed

+3315
-1
lines changed

3sum/chjung99.java

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
// two pointer
2+
// time: O(N^2)
3+
// space: O(N)
4+
5+
class Solution {
6+
Set<List<Integer>> set = new HashSet<>();
7+
public List<List<Integer>> threeSum(int[] nums) {
8+
Arrays.sort(nums);
9+
10+
for (int i = 0; i < nums.length; i++){
11+
twoSum(nums, i);
12+
}
13+
14+
return new ArrayList<>(set);
15+
}
16+
public void twoSum(int[] nums, int targetIdx){
17+
int left = 0;
18+
int right = nums.length - 1;
19+
20+
while (left < right) {
21+
if (left == targetIdx){
22+
left ++;
23+
continue;
24+
}
25+
if (right == targetIdx){
26+
right--;
27+
continue;
28+
}
29+
if (nums[left] + nums[right] == -nums[targetIdx]) {
30+
if (nums[left] > nums[targetIdx]){
31+
set.add(List.of(nums[targetIdx], nums[left], nums[right]));
32+
}
33+
else if (nums[targetIdx] > nums[right]){
34+
set.add(List.of(nums[left],nums[right],nums[targetIdx]));
35+
} else{
36+
set.add(List.of(nums[left], nums[targetIdx], nums[right]));
37+
}
38+
left++;
39+
} else if (nums[left] + nums[right] < -nums[targetIdx]){
40+
left ++;
41+
} else {
42+
right --;
43+
}
44+
}
45+
}
46+
}
47+
48+

3sum/ymir0804.java

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import java.util.ArrayList;
2+
import java.util.Arrays;
3+
import java.util.List;
4+
5+
class Solution {
6+
public List<List<Integer>> threeSum(int[] nums) {
7+
List<List<Integer>> answer = new ArrayList<>();
8+
Arrays.sort(nums);
9+
int sum = 0;
10+
11+
for (int i = 0; i < nums.length-2; i++) {
12+
int left = i + 1;
13+
int right = nums.length -1;
14+
if(i > 0 && nums[i-1] == nums[i]) {
15+
continue;
16+
}
17+
while (left < right ) {
18+
sum = nums[i] + nums[left] + nums[right];
19+
if(sum > 0) {
20+
right--;
21+
} else if(sum < 0 ) {
22+
left++;
23+
} else {
24+
answer.add(Arrays.asList(nums[i], nums[left], nums[right]));
25+
while (left < right && nums[left] == nums[left + 1]) {
26+
left++;
27+
}
28+
while (left < right && nums[right] == nums[right - 1]) {
29+
right--;
30+
}
31+
left++;
32+
right--;
33+
}
34+
}
35+
36+
}
37+
return answer;
38+
}
39+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
/**
2+
일단 가장 단순하게 생각했을 때,
3+
n^2 의 시간 복잡도를 가지면 모든 경우의 수를 확인가능하다.
4+
5+
function maxProfit(prices: number[]): number {
6+
let maximum = 0
7+
for(let i=0; i<prices.length-1; i++) {
8+
for(let j=i; j<prices.length; j++) {
9+
if(prices[j] - prices[i] > maximum) maximum = prices[j] - prices[i]
10+
}
11+
}
12+
return maximum
13+
};
14+
*/
15+
16+
/**
17+
하지만 시간 초과가 발생하니, 다른 방법을 써보자.
18+
이익을 구하기 위해서는 가장 낮은 지점과 가장 큰 지점에 대한 탐색이 필요하다.
19+
가장 낮은 지점은 큰 지점보다 앞에 위치해야 한다.
20+
21+
만약 투 포인터로 양 끝에서 오면서 왼쪽은 가장 낮은 것, 오른쪽은 가장 높은 것을 확인해서
22+
두 포인터가 만날 때 차분을 구한다면?
23+
24+
function maxProfit(prices: number[]): number {
25+
let left = prices[0];
26+
let right = prices[prices.length-1];
27+
for (let i=0; i<prices.length; i++) {
28+
if (i > (prices.length - 1 - i)) {
29+
break
30+
}
31+
32+
if (prices[i] < left) {
33+
left = prices[i]
34+
}
35+
36+
if (prices[prices.length - 1 - i] > right) {
37+
right = prices[prices.length - 1 - i]
38+
}
39+
}
40+
41+
return left > right ? 0 : right - left
42+
};
43+
*/
44+
45+
/**
46+
[3,2,6,5,0,3] 와 같은 경우에 일반화 되지 못한다.
47+
정답을 기준으로, 큰 값 이후에는 그보다 큰 값이 없어야 하고,
48+
작은 값 이전에는 그보다 작은 값이 없어야 한다.
49+
50+
그렇다면 포인터를 이 기준에 맞게 급격히 옮겨볼까?
51+
...
52+
힌트를 보고 왔다. 단순하게 최저값을 항상 갱신해주면 되는구나.
53+
*/
54+
function maxProfit(prices: number[]): number {
55+
let min = 10000;
56+
let max = 0;
57+
for (let i = 0; i < prices.length; i++) {
58+
if (prices[i] < min) {
59+
min = prices[i];
60+
continue;
61+
}
62+
63+
if (prices[i] - min > max) {
64+
max = prices[i] - min;
65+
}
66+
}
67+
return max;
68+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
function maxProfit(prices: number[]): number {
2+
let min = prices[0];
3+
let max = 0;
4+
5+
for (let i = 0; i < prices.length; i++) {
6+
min = Math.min(min, prices[i]);
7+
max = Math.max(max, prices[i] - min);
8+
}
9+
10+
return max;
11+
}
12+
13+
const prices = [3, 3, 5, 0, 0, 3, 1, 4];
14+
maxProfit(prices);
15+
16+
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/**
2+
* Runtime: 1ms
3+
* Time Complexity: O(n)
4+
*
5+
* Memory: 94.08MB
6+
* Space Complexity: O(1)
7+
*
8+
* Approach: 그리디 알고리즘
9+
* - 주어진 prices 배열을 순회하며 최소 가격(min)을 갱신
10+
*/
11+
class Solution {
12+
public int maxProfit(int[] prices) {
13+
int maxProfit = 0;
14+
int min = prices[0];
15+
16+
for (int i=1; i<prices.length; i++) {
17+
if (min >= prices[i]) {
18+
min = prices[i];
19+
} else {
20+
maxProfit = Math.max(maxProfit, prices[i]-min);
21+
}
22+
}
23+
24+
return maxProfit;
25+
}
26+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
'''
2+
문제: 한번의 구매와 판매로 얻을 수 있는 최대 이익을 구하라.
3+
풀이: 주어진 가격 리스트를 순회하면서 최저가와 최고가를 갱신하며 최대 이익을 계산한다.
4+
최저가는 현재 최저가격보다 낮은 가격이 나오면 갱신하고,
5+
최고가는 현재 최고가격보다 높은 가격이 나오면 갱신및 정답인지 비교한다.
6+
시간복잡도: O(n)
7+
공간복잡도: O(1)
8+
9+
'''
10+
11+
12+
class Solution:
13+
def maxProfit(self, prices: List[int]) -> int:
14+
ma, mi = prices[0], prices[0]
15+
answ = 0
16+
for i in range(1, len(prices)):
17+
if mi > prices[i]:
18+
mi, ma = prices[i], prices[i]
19+
if ma < prices[i]:
20+
ma = prices[i]
21+
answ = max(answ, ma-mi)
22+
return answ
23+
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
function maxProfit(prices: number[]): number {
2+
const dp = new Array(prices.length).fill(0);
3+
dp[0] = 0;
4+
let maxProfit = 0;
5+
for (let i = 1; i < prices.length; i++) {
6+
dp[i] = Math.max(prices[i] - prices[i - 1], prices[i] - prices[i - 1] + dp[i - 1]);
7+
8+
maxProfit = Math.max(dp[i], maxProfit);
9+
}
10+
return maxProfit;
11+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
class Solution:
2+
def maxProfit(self, prices: List[int]) -> int:
3+
min_price = prices[0]
4+
max_profit = 0
5+
6+
for price in prices[1:]:
7+
if price < min_price:
8+
min_price = price
9+
elif price - min_price > max_profit:
10+
max_profit = price - min_price
11+
12+
return max_profit
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
"""
2+
Blind 75 - Best Time to Buy and Sell Stock
3+
https://leetcode.com/problems/best-time-to-buy-and-sell-stock/
4+
5+
시간복잡도 : O(n)
6+
공간복잡도 : O(1)
7+
풀이 : 한 번의 순회로 해결
8+
9+
prices = [7,1,5,3,6,4]
10+
11+
price | min | max_profit
12+
7 | 7 | 0
13+
1 | 1 | 0
14+
5 | 1 | 4
15+
3 | 1 | 4
16+
6 | 1 | 5
17+
4 | 1 | 5
18+
19+
"""
20+
from typing import List
21+
22+
class Solution:
23+
def maxProfit(self, prices: List[int]) -> int:
24+
max_profit = 0
25+
min_price = prices[0]
26+
27+
for price in prices:
28+
min_price = min(min_price, price)
29+
max_profit = max(max_profit, price - min_price)
30+
31+
return max_profit
32+
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
2+
# 121. Best Time to Buy and Sell Stock
3+
# O(n) - Two Pointers
4+
class Solution:
5+
def maxProfit(self, prices: list[int]) -> int:
6+
left = 0
7+
right = 1
8+
profit = 0
9+
max_profit = 0
10+
11+
while right < len(prices):
12+
if prices[right] > prices[left]:
13+
profit = prices[right] - prices[left]
14+
max_profit = max(profit, max_profit)
15+
else:
16+
left = right
17+
right += 1
18+
return max_profit

0 commit comments

Comments
 (0)