Algorithm/Greedy
[Greedy] LeetCode “53. Maximum Subarray“ Python 풀이
운호(Noah)
2024. 3. 23. 19:32
문제 링크
풀이
해당 문제는 그리디 알고리즘(Greedy Algorithm)의 한 종류인 카데인 알고리즘(Kadane’s Algorithm)을 사용해서 해결할 수 있습니다.
카데인 알고리즘(Kadane's Algorithm)은 배열에서 연속된 부분 배열의 최대 합을 구하는 효율적인 알고리즘입니다.
이 알고리즘은 O(N)의 시간 복잡도를 가지며, 다음과 같은 단계로 진행됩니다.
- "현재 합"과 "최대 합"을 -inf(음의 무한대)로 초기화합니다.
- 배열을 순회하며 다음 두 가지 경우 중 큰 값을 “현재 합”으로 갱신합니다.
- 이전 인덱스까지의 “현재 합” + 현재 인덱스의 값
- 현재 인덱스의 값
- “현재 합”이 “최대 합”보다 크면 “최대 합”을 “현재 합”으로 갱신합니다.
예를 들어, 배열 [-2, 1, -3, 4, -1, 2, 1, -5, -2, 5]의 경우 다음과 같이 진행됩니다.
초기화: 최대 합 = -inf, 현재 합 = -inf -2: 현재 합 = max(-2, -inf + (-2)) = -2 1: 현재 합 = max(1, -2 + 1) = 1 -3: 현재 합 = max(-3, 1 + (-3)) = -2 4: 현재 합 = max(4, -2 + 4) = 4, 최대 합 갱신 = 4 -1: 현재 합 = max(-1, 4 + (-1)) = 3 2: 현재 합 = max(2, 3 + 2) = 5, 최대 합 갱신 = 5 1: 현재 합 = max(1, 5 + 1) = 6, 최대 합 갱신 = 6 -5: 현재 합 = max(-5, 6 + (-5)) = 1 -2: 현재 합 = max(-2, 1 + (-2)) = -1 5: 현재 합 = max(5, -1 + 5) = 4
따라서, 이 배열에서 연속된 부분 배열의 최대 합은 6입니다.
코드
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
curr_sum = float(-inf)
max_sum = float(-inf)
for i in range(len(nums)):
curr_sum = max(curr_sum + nums[i], nums[i])
max_sum = max(curr_sum, max_sum)
return max_sum