Leetcode Java Maximum Sum of Two Non-Overlapping Subarrays
업데이트:
문제
코드
class Solution {
public int maxSumTwoNoOverlap(int[] nums, int firstLen, int secondLen) {
return Math.max(this.maxSum(nums, firstLen, secondLen), this.maxSum(nums, secondLen, firstLen));
}
private int maxSum(int[] nums, int firstLen, int secondLen) {
int sumFirstLen = 0;
int sumSecondLen = 0;
for (int i = 0; i < firstLen + secondLen; i++) {
if (i < firstLen) {
sumFirstLen += nums[i];
} else {
sumSecondLen += nums[i];
}
}
int result = sumFirstLen + sumSecondLen;
for (int i = firstLen + secondLen, max = sumFirstLen; i < nums.length; i++) {
sumFirstLen += nums[i - secondLen] - nums[i - firstLen - secondLen];
sumSecondLen += nums[i] - nums[i - secondLen];
max = Math.max(max, sumFirstLen);
result = Math.max(result, max + sumSecondLen);
}
return result;
}
}
결과
설명
-
nums의 firstLen 크기와 secondLen 크기의 겹치지 않은 연속된 부분 배열들의 합이 최대인 값을 구하는 문제이다.
-
3번에서 정의한 maxSum(int[] nums, int firstLen, int secondLen)에 firstLen과 secondLen을 순서를 바꾸어 각각 수행한 결과 중 큰 값을 주어진 문제의 결과로 반환한다.
- 문제 풀이에 필요한 변수를 정의한다.
- sumFirstLen과 sumSecondLen은 firstLen과 secondLen 크기의 연속된 부분 배열의 값의 합을 저장할 변수로, nums의 firstLen개의 값과 그 다음 secondLen개의 값을 각각 더해준다.
- result는 부분 배열들의 합을 저장할 변수로, sumSecondLen과 sumFirstLen의 값을 더해서 넣어준다.
- $firstLen + secondLen$부터 nums의 길이 미만까지 i를 증가시키고, max에 sumFirstLen을 넣어 아래를 반복한다.
- sumFirstLen에 다음 위치 값인 nums[$i - secondLen$] 값을 더한 후, 제거 할 좌측 값인 nums[$i - firstLen - secondLen$] 값을 빼준다.
- sumSecondLen에 다음 위치 값인 nums[i] 값을 더한 후, 제거 할 좌측 값인 nums[$i - secondLen$] 값을 빼준다.
- max에 이전까지 첫 부분 배열의 최댓값인 max와 현재 첫 부분 배열의 합인 sumFirstLen 중 큰 값을 넣어준다.
- result에 이전까지 최댓값인 result와 현재 값들의 합인 $max + sumSecondLen$ 중 큰 값을 넣어준다.
- 반복이 완료되면 각 구간의 합이 최대가 되는 결과가 저장된 result를 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기