반응형
/*
정수 배열 nums가 주어졌을 때, **가장 큰 합을 가지는 연속된 부분 배열(subarray)**을 찾아 그 합을 반환하세요.
*/
/*
dp[i] = max(dp[i-1]+nums[i], nums[i])
*/
class Solution {
public int maxSubArray(int[] nums) {
int result = -100001;
int [] dp = new int[100000];
Arrays.fill(dp, -100001);
dp[0] = nums[0];
for(int i=1; i<nums.length; i++) {
dp[i] = Math.max(dp[i-1] + nums[i], nums[i]);
}
return Arrays.stream(dp).reduce((a,b) -> Math.max(a,b)).getAsInt();
}
}
가장 큰 합을 찾는 문제이다.
예를들어 다음과 같은 입력이 있다고 가정하면
Input: nums = [-2,1,-3,4,-1,2,1,-5,4]
Output: 6
Explanation: The subarray [4,-1,2,1] has the largest sum 6.
위와같이, 연속된 숫자중에서 4 -1 2 1 이 가장 큰 합을 가지고 그것을 출력하는 문제이다.
이와같은 속성으로 dp로 문제를 풀면된다.
앞의 갚이 뒤에 갚에 영향을 준다고 생각하면 된다.
점화식은 다음과 같다.
dp[i] = Math.max(dp[i-1] + nums[i], nums[i]);
만약 이전까지의 합(dp[i-1)과 현재값을 더한게 더 크다면 이것을 넣고, 아니면 자기자신을 넣으면된다.
자기자신을 넣는다는건 지금까지 탐색해왔던 연속된합보다 내가 더 크다는 것을 의미한다.
시간복잡도는 o(n) 이다.
반응형
'Algorithm' 카테고리의 다른 글
leetcode 1143 java dp (0) | 2025.03.13 |
---|---|
leetcode 198 java dp (0) | 2025.03.13 |
leetcode 62 java dp (0) | 2025.03.13 |
leetcode 167 java (0) | 2025.03.06 |
leetcode 33 java (0) | 2025.03.06 |