https://leetcode.com/problems/maximum-subarray/description/
코드설명
동적계획법(DP, Dynamic Programming) 을 활용합니다.
dp[i] = [0..i] 에서 최대부분배열의 합입니다.
중요한점은, 만약 이전 부분배열 DP[i-1]이 음수라면, 현재값을 더하면 반드시 숫자가 작아집니다. 그러므로 최대값을 계속해서 갱신해나갑니다.
코드
class Solution {
public int maxSubArray(int[] nums) {
int answer = -(int) Math.pow(10, 4);
int[] dp = new int[nums.length];
for(int i=0; i<nums.length; i++){
if(i == 0) {
answer = nums[0];
dp[i] = nums[0];
continue;
}
if(dp[i -1] > 0) dp[i] = dp[i-1] + nums[i];
else dp[i] = nums[i];
answer = Math.max(answer, dp[i]);
}
return answer;
}
}
처음에 분할정복으로 풀어보려고 한 코드입니다.. 하지만 실패했습니다.
class Solution {
int[] Nums;
public int maxSubArray(int[] nums) {
int MAX = nums[0];
int now = nums[0];
int temp = 0;
for(int i=1; i<nums.length; i++){
temp = nums[i];
if(nums[i] > 0){
MAX = Math.max(nums[i], MAX + nums[i]);
}
else if(nums[i] < 0){
temp = temp
}
}
return dq(0, Nums.length - 1);
}
}
// class Solution {
// int[] Nums;
// public int maxSubArray(int[] nums) {
// Nums = nums;
// return dq(0, Nums.length - 1);
// }
// int dq(int left, int right){
// if(left == right) return Nums[left];
// int mid = (left + right) / 2;
// int num1 = dq(left, mid);
// int num2 = dq(mid + 1, right);
// int num3 = 0;
// for(int i=left; i<=right; i++){
// num3 += Nums[i];
// }
// return Math.max(num1, Math.max(num2, num3));
// }
// }