medium/dp 152 성공
This commit is contained in:
34
medium/dp/152.py
Normal file
34
medium/dp/152.py
Normal file
@@ -0,0 +1,34 @@
|
||||
# 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로 전체 기억도 한다.
|
||||
"""
|
||||
Reference in New Issue
Block a user