Skip to content

Commit df55f63

Browse files
committed
rivkode maximun subarray
1 parent 71ca08a commit df55f63

File tree

1 file changed

+69
-0
lines changed

1 file changed

+69
-0
lines changed

maximum-subarray/rivkode.java

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
/*
2+
1. 문제 이해
3+
4+
[-2,1,-3,4,-1,2,1,-5,4]
5+
* 정답부분 참고
6+
각 인덱스를 시작점으로 잡고 모든 부분에 대한 부분 배열의 합을 구한다
7+
이전에 계산했던 내용을 저장해서 사용한다
8+
-> 이렇게 계산해도 Time Limit Exceeded 발생하네 ..
9+
10+
결국엔 이렇게 해도 n^2 시간이 발생하므로 시간초과
11+
포인트는 n^2 가 걸리는 시간을 어떻게 nlogn이나 n으로 줄일 수 있는지임
12+
13+
* 정답 부분 참고
14+
누적합이 음수라면 시작 인덱스를 다음으로 과감하게 옮긴다
15+
16+
17+
이 문제는 직관적으로 문제를 바라보는것이 중요했다.
18+
아마도 이렇게 접근하는건 어떨까 ?
19+
나는 최대합을 구하고싶었다. 부분 배열로!
20+
부분배열이라는 것은 연속된다는 것이 특징이다.
21+
22+
즉, 연속되어야 하므로 이전의 합들이 만약 음수라면 ? 이 부분들은 필요가 없어지므로 과감히 버릴 수 있다는 것을 아는 것이 포인트였다.
23+
24+
버린다는 것의 의미는 ? -> 현재 인덱스의 값과 이전 전체의 값들의 합을 비교해서 현재 인덱스부터 다시 출발한다는 것이다. 그러므로 비교해서 더 큰값을 total로 가져가는 것이다.
25+
26+
만약 이걸 처음부터 알았다면 그리고 기존에 작성한 n^2 를 소요하면서 모든 합을 구하려 했을때 비효율적인것을 직감했다면 다른 방법으로 접근할 수 있었어야 했다.
27+
28+
그리고 처음 total, maxTotal을 첫번째 인덱스로 지정해줬기 때문에 i 인덱스는 1부터 시작해야한다
29+
30+
31+
*/
32+
33+
import java.util.*;
34+
35+
class Solution {
36+
public int maxSubArray(int[] nums) {
37+
int total = nums[0];
38+
int maxTotal = nums[0];
39+
40+
41+
for (int i=1; i<nums.length; i++) {
42+
total = Math.max(nums[i], total + nums[i]);
43+
maxTotal = Math.max(total, maxTotal);
44+
}
45+
46+
return maxTotal;
47+
48+
// for (int i=0; i<nums.length; i++) {
49+
// int total = 0;
50+
// for (int j=i; j<nums.length; j++) {
51+
// total += nums[j];
52+
// max = Math.max(total, max);
53+
// if (total < 0) {
54+
// break;
55+
// }
56+
// }
57+
// }
58+
59+
// return max;
60+
}
61+
62+
private int sum(int[] arr, int start, int end) {
63+
int cnt = 0;
64+
for (int i=start; i<end + 1; i++) {
65+
cnt += arr[i];
66+
}
67+
return cnt;
68+
}
69+
}

0 commit comments

Comments
 (0)