홈 LeetCode. 53. Maximum Subarray
글
취소

LeetCode. 53. Maximum Subarray

image

문제 링크

풀이

입력 배열은 비어 있지 않다고 보장됩니다. 배열을 한 번 순회하면서 현재 인덱스에서 끝나야 하는 부분 배열의 최대 합(ending)과 지금까지 확인한 전체 최대 합(best)을 추적합니다. 각 원소에서 이전 부분 배열을 이어 가거나 현재 원소부터 새로 시작합니다.

ending = max(nums[i], ending + nums[i])

ending을 갱신한 뒤, 새 끝부분 합이 더 크면 best도 갱신합니다. 두 값을 모두 nums[0]으로 초기화하면 모든 후보가 비어 있지 않은 부분 배열이 됩니다. 특히 모든 값이 음수인 경우, 0을 잘못 반환하는 대신 가장 큰(음수 중 가장 0에 가까운) 단일 원소 부분 배열의 합을 반환합니다.

인덱스 i를 처리한 뒤의 불변식은 ending이 i에서 끝나는 모든 비어 있지 않은 부분 배열 중 최대 합이고, best가 처리된 접두부에 있는 모든 비어 있지 않은 부분 배열 중 최대 합이라는 것입니다.

시간 복잡도는 O(N), 추가 공간 복잡도는 O(1)입니다.

Java

1
2
3
4
5
6
7
8
9
10
11
class Solution {
    public int maxSubArray(int[] nums) {
        int ending = nums[0];
        int best = nums[0];
        for (int i = 1; i < nums.length; i++) {
            ending = Math.max(nums[i], ending + nums[i]);
            best = Math.max(best, ending);
        }
        return best;
    }
}
이 글은 저자가 CC BY 4.0 라이선스로 배포합니다.