34 lines
1.7 KiB
Python
34 lines
1.7 KiB
Python
# Maximum Product Subarray
|
|
|
|
class Solution:
|
|
def maxProduct(self, nums: list[int]) -> int:
|
|
max_p = nums[0]
|
|
min_p = nums[0]
|
|
result = nums[0]
|
|
|
|
for i in range(1, len(nums)):
|
|
now = nums[i]
|
|
|
|
tmp_max_p = max_p
|
|
|
|
max_p = max(now, now*tmp_max_p, now*min_p)
|
|
min_p = min(now, now*tmp_max_p, now*min_p)
|
|
|
|
result = max(max_p, result)
|
|
|
|
return result
|
|
|
|
"""
|
|
걸린 시간: 몰라
|
|
|
|
복잡도: 리스트를 한번 순회하기 때문에 시간복잡도는 O(n)이고, 변수 3개만 선언해서 사용하기 때문에 공간복잡도는 O(1)이다.
|
|
|
|
해설: 일단 자력으로 풀지 못하고 답을 확인했다.
|
|
구간에 음수 개수가 홀수냐 짝수냐와 0의 위치에 따라서 구간이 나눠진다고 생각했다.
|
|
지금까지 최대 양수와 최대 음수를 기억하면서 가보자라는 생각을 하긴 했었는데, 그 후로 더 하진 못했다.
|
|
정답은 너무 어렵게 생각할 필요없이, 음수 계산을 위해 현재까지의 최대값과 최소값을 기록하고, 2개의 값을 초기화하는 기준을
|
|
현재 요소부터 시작할지/현재 요소를 최대값에 곱할지/현재 요소를 최소값에 곱할지 이다.
|
|
현재 요소를 무조건 쓴다가 전제인 이유는 안 쓴다면 다음 요소를 볼때 한 칸 떨어져버려서 부분배열이 되지 않기 때문이다.
|
|
즉, 이어지거나 말거나인데, 이어질거라면 음수인지 양수인지 모르니까 최대, 최소에 다 곱하라는 의미이다.
|
|
그리고 이렇게 이어지거나 말거나가 될 수 있으니까 전체로 보았을 때 최대를 result로 전체 기억도 한다.
|
|
""" |