這道題是 LeetCode 的經典題之一,要求我們找出 一個子陣列,使其和最大,並返回這個最大和的數值。
題目要求nums
,找到一個具有最大和的 子陣列(subarray),並返回其最大和。1 <= nums.length <= 10^5
-10^4 <= nums[i] <= 10^4
這表示我們要找 最優解法,因為 nums
可能非常大,暴力解法的 O(n²) 可能會超時。
輸入: nums = [-2,1,-3,4,-1,2,1,-5,4]
輸出: 6
解釋: 最大子陣列為 [4, -1, 2, 1],其和為 4 + (-1) + 2 + 1 = 6。
輸入: nums = [1]
輸出: 1
解釋: 只有一個數,所以答案就是 1。
輸入: nums = [5,4,-1,7,8]
輸出: 23
解釋: 最大子陣列為 [5, 4, -1, 7, 8],其和為 23。
dp[i]
存儲 以 nums[i]
為結尾的最大子陣列和,然後找出最大值。nums
的所有 子陣列,計算其總和。class Solution:
def maxSubArray(self, nums: List[int]) -> int:
max_sum = float('-inf')
n = len(nums)
for i in range(n):
current_sum = 0
for j in range(i, n):
current_sum += nums[j]
max_sum = max(max_sum, current_sum)
return max_sum
current_sum
來記錄 當前以 nums[i]
為結尾的最大子陣列和。current_sum
變成負數,則 從下一個數字重新開始(因為負數會降低總和)。max_sum
,確保記錄到最大的結果。class Solution:
def maxSubArray(self, nums: List[int]) -> int:
max_sum = nums[0]
current_sum = nums[0]
for i in range(1, len(nums)):
current_sum = max(nums[i], current_sum + nums[i])
max_sum = max(max_sum, current_sum)
return max_sum
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
def divide_and_conquer(left, right):
if left == right:
return nums[left]
mid = (left + right) // 2
left_sum = divide_and_conquer(left, mid)
right_sum = divide_and_conquer(mid + 1, right)
cross_sum = find_cross_sum(nums, left, right, mid)
return max(left_sum, right_sum, cross_sum)
def find_cross_sum(nums, left, right, mid):
left_max = float('-inf')
right_max = float('-inf')
sum_temp = 0
for i in range(mid, left - 1, -1):
sum_temp += nums[i]
left_max = max(left_max, sum_temp)
sum_temp = 0
for i in range(mid + 1, right + 1):
sum_temp += nums[i]
right_max = max(right_max, sum_temp)
return left_max + right_max
return divide_and_conquer(0, len(nums) - 1)
這題是一道經典的動態規劃問題,適合用 Kadane's Algorithm 來解,因為它的 O(n) 時間複雜度 適合大數據量。