|
| 1 | +class Solution: |
| 2 | + def maxSubArray(self, nums: list[int]) -> int: |
| 3 | + """리스트의 이어진 문자열로 구성된 subarray중 최대 합을 찾는 함수 |
| 4 | +
|
| 5 | + 방법: |
| 6 | + 1. brute force. 다만 O(n)으로 만들 수 없어 탈락! |
| 7 | + 2. 전역 최대합과 로컬 최대 합을 분리해서 생각하기. |
| 8 | + 연속된 문자열이기 때문에, 현재 값이 이전의 합보다 크면 앞의 값을 버리는 방식 |
| 9 | + => 시간 복잡도 O(n), 공간 복잡도 O(1) |
| 10 | + 3. divide and conquer (Follow up) |
| 11 | +
|
| 12 | + Args: |
| 13 | + nums (list[int]): 정수 문자열 |
| 14 | +
|
| 15 | + Returns: |
| 16 | + int: 최대 합 |
| 17 | + """ |
| 18 | + max_sum = nums[0] |
| 19 | + local_sum = nums[0] |
| 20 | + for i in range(1, len(nums)): |
| 21 | + if local_sum < 0 and local_sum < nums[i]: |
| 22 | + local_sum = nums[i] |
| 23 | + else: |
| 24 | + local_sum += nums[i] |
| 25 | + max_sum = max(max_sum, local_sum) |
| 26 | + return max_sum |
| 27 | + |
| 28 | + def maxSubArraySubtle(self, nums: list[int]) -> int: |
| 29 | + def divConq(left: int, right: int) -> int: |
| 30 | + if left == right: |
| 31 | + return nums[left] |
| 32 | + mid = (left + right) // 2 |
| 33 | + |
| 34 | + left_max = divConq(left, mid) |
| 35 | + right_max = divConq(mid + 1, right) |
| 36 | + |
| 37 | + curr_sum = 0 |
| 38 | + left_suffix_max = -float("inf") |
| 39 | + for idx in range(mid, left - 1, -1): |
| 40 | + curr_sum += nums[idx] |
| 41 | + left_suffix_max = max(left_suffix_max, curr_sum) |
| 42 | + |
| 43 | + curr_sum = 0 |
| 44 | + right_prefix_max = -float("inf") |
| 45 | + for idx in range(mid + 1, right + 1, 1): |
| 46 | + curr_sum += nums[idx] |
| 47 | + right_prefix_max = max(right_prefix_max, curr_sum) |
| 48 | + |
| 49 | + cross = left_suffix_max + right_prefix_max |
| 50 | + return max(left_max, right_max, cross) |
| 51 | + |
| 52 | + return divConq(0, len(nums) - 1) |
0 commit comments