|
1 | 1 | """
|
2 |
| - /풀이 봐도 잘 이해 못해서 추가 코멘트/ |
3 |
| - nums[i]가 그 전까지 subarray의 합 total보다 작은 음수인 케이스는 어떻게 되는거지 고민했는데 |
4 |
| - ex) total : -1, nums[i] = -2 |
5 |
| - 어차피 -1인 시점에 maxTotal이 업데이트 됐으므로 total은 nums[i]부터 더하기 시작한다는 의미로 -2로 설정한다는 것을 깨달음 |
6 |
| - 따라서 이전까지 subarray의 합만 음수 양수 체크 |
7 |
| - |
8 |
| - TC : for문 한번 |
9 |
| - => O(N) |
10 |
| - SC : 추가적인 배열 등 메모리 쓰지 않으므로 |
11 |
| - => O(1) |
| 2 | + ** 실수로 예전 과제 수행 때 다른 과제폴더에 파일을 만들어서 파일 수정합니다!! |
| 3 | +
|
| 4 | + 풀이 : |
| 5 | + nums의 구성요소 num에 따라 각각 후보1, 후보2, 후보3 중에 |
| 6 | + 가장 큰 값은 새로운 max_res, 가장 작은 값은 새로운 min_res |
| 7 | +
|
| 8 | + 후보1: 이전 max_res * 현재 num (num이 양수일 경우 가장 클 가능성) |
| 9 | + 후보2: 이전 min_res * 현재 num (num이 음수일 경우 가장 클 가능성) |
| 10 | + 후보3: 현재 num (num이 양수일 경우 가장 클 가능성) |
| 11 | +
|
| 12 | + 새로운 max_res와 max_total을 비교해서 업데이트 |
| 13 | +
|
| 14 | + |
| 15 | + 메모 : |
| 16 | + - 현재 num이 0일 경우 후보 셋 모두 0 |
| 17 | + - 음수 양수 0 등으로 조건을 나누지 않고 min과 max로만 구분해도 충분하다 |
| 18 | + - max_res와 min_res는 곱해지므로 초기화를 1로 한다 (또는 반복문을 인덱스로 반복하고 1부터 시작) |
| 19 | + |
| 20 | + |
| 21 | + nums의 길이 : n |
| 22 | +
|
| 23 | + TC : O(N) |
| 24 | +
|
| 25 | + SC : O(1) |
12 | 26 | """
|
| 27 | + |
13 | 28 | class Solution:
|
14 |
| - def maxSubArray(self, nums: List[int]) -> int: |
15 |
| - total = nums[0] |
16 |
| - maxTotal = nums[0] |
17 |
| - for i in range(1, len(nums)) : |
18 |
| - if (total < 0) : |
19 |
| - total = nums[i] |
20 |
| - else : |
21 |
| - total += nums[i] |
22 |
| - maxTotal = max(total, maxTotal) |
23 |
| - return (maxTotal) |
| 29 | + def maxProduct(self, nums: List[int]) -> int: |
| 30 | + max_total, max_res, min_res = nums[0], 1, 1 |
| 31 | + for num in nums : |
| 32 | + min_res, max_res = min(num, max_res * num, min_res * num), \ |
| 33 | + max(num, max_res * num, min_res * num) |
| 34 | + max_total = max(max_total, max_res) |
| 35 | + return max_total |
0 commit comments