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)); // } // }