브루트포스로 구간을 다 확인하면서 풀 수 있지만 O(N2)이기 때문에 N이 커지면 엄청 느려진다. O(N)으로 풀어보자.
여기서 시작한다. 현위치에서 "current_sum이랑 더하는 게 클까, 혼자 있는 게 클까?"라고 물어보면 된다.
index = 1
에서 "-2+1이 더 커, 1 혼자 있는 게 더 커?"라고 물어본다. 이때 -2를 더한 거라면 앞에 있는 값을 연속적으로 더하는 게 되는 것이고, 반대로 혼자있는 게 더 크면 그 index부터 값을 계산하는 것이다.
index = 3
에서 4 혼자있는 게 더 커서 여기가 시작점이 되었다.
1) 위의 설명에 해당하는 코드
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
max_sum = nums[0]
current_sum = max_sum
for i in range(1, len(nums)):
current_sum = max(nums[i], current_sum+nums[i])
max_sum = max(current_sum, max_sum)
return max_sum
2) 구간합을 구했을 때 음수가 나오면 굳이 계산할 때 쓸 필요가 없다.
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
curSum = nums[0]
maxSum = curSum
for i in range(1, len(nums)):
if curSum < 0:
curSum = 0
curSum += nums[i]
maxSum = max(curSum, maxSum)
return maxSum