152 성공
This commit is contained in:
29
repetition/dp/152.py
Normal file
29
repetition/dp/152.py
Normal file
@@ -0,0 +1,29 @@
|
||||
# Maximum Product Subarray
|
||||
|
||||
class Solution:
|
||||
def maxProduct(self, nums: list[int]) -> int:
|
||||
answer = nums[0]
|
||||
now_max = nums[0]
|
||||
now_min = nums[0]
|
||||
|
||||
for num in nums[1:]:
|
||||
temp_min = now_min
|
||||
now_min = (num, now_max * num, now_min * num)
|
||||
now_max = (num, now_max * num, temp_min * num)
|
||||
|
||||
answer = max(answer, now_max)
|
||||
|
||||
return answer
|
||||
|
||||
"""
|
||||
걸린 시간: 몰라
|
||||
|
||||
복잡도: nums 리스트를 한번 순회하는데 이때마다 현재 최대, 최소, 전체 최대 변수만 관리하기 때문에 시간복잡도는 O(n)이고, 공간복잡도는 O(1)이다.
|
||||
|
||||
해설: 또 못 풀었다. 이 문제의 포인트는 음수가 홀수개이거나, 0이 있을 때 양쪽 중에 어디가 더 최대인가를 판단하는 것이라고 생각했다.
|
||||
그 기준점을 나눌 때 본인부터 부분 수열을 시작하게 하면서 이전의 기록들을 어떻게 가져갈지 고민이 되었다.
|
||||
왜냐하면 음수가 홀수개일때는 최소인 값들이 음수 하나를 더 만나면 최대값이 될 수도 있기 때문에 기록을 해두면서 가야했다.
|
||||
본인이 양수든 음수든 상관없이 현재 최대값과 최소값에 곱해보고 거기서 두 변수를 갱신하면 현재까지의 수열 중 최대를 계속 가져갈 수 있다.
|
||||
여기서 가져갈 건 연속된 부분수열의 경우 현재의 것을 무조건 쓰는 경우의 수로 두고 기존과 비교해서 최대를 구해야 한다는 것과
|
||||
음수와 0의 존재를 인지하고, 부호가 바뀔 것을 고려하여 현재까지의 최소값도 기록해두는 것이다.
|
||||
"""
|
||||
Reference in New Issue
Block a user