最小子序和问题指的是在一个整数数组里找出一个连续的子数组,让该子数组的和达到最小。下面为你介绍两种常见的解决办法:
方法一:暴力枚举法
暴力枚举法的核心思路是把所有可能的子数组都列举出来,再算出它们的和,最后找出其中的最小值。
def min_subarray_sum_brute_force(nums):
n = len(nums)
min_sum = float('inf')
for i in range(n):
for j in range(i, n):
subarray_sum = sum(nums[i:j + 1])
min_sum = min(min_sum, subarray_sum)
return min_sum
nums = [1, -2, 3, -4, 5, -6]
print(min_subarray_sum_brute_force(nums))
这种方法的时间复杂度为 \(O(n^2)\),因为需要两层循环来枚举所有可能的子数组。
方法二:动态规划(Kadane 算法)
Kadane 算法的核心思路是在遍历数组的过程中,持续记录以当前元素结尾的最小子数组和,进而得到全局的最小子数组和。
def min_subarray_sum_kadane(nums):
n = len(nums)
current_sum = nums[0]
min_sum = nums[0]
for i in range(1, n):
current_sum = min(nums[i], current_sum + nums[i])
min_sum = min(min_sum, current_sum)
return min_sum
nums = [1, -2, 3, -4, 5, -6]
print(min_subarray_sum_kadane(nums))
Kadane 算法的时间复杂度为 (O(n)),因为只需要对数组进行一次遍历。
综上所述,若数组规模较小,可采用暴力枚举法;若数组规模较大,建议使用 Kadane 算法,它的效率更高。