思路:

  1. 如果最大子数组不跨越数组首尾,则直接使用普通的最大子数组和算法即可。
  2. 如果最大子数组跨越数组首尾,则意味着子数组包含了数组中间的某些元素,可以转化为求一个非最大子数组的最小子数组和,然后用总和减去这个最小子数组和即可得到最大子数组和。

具体实现:

  1. 首先使用 Kadane 算法求出最大子数组和 maxSum1。这一步和普通的最大子数组和问题相同。
  2. 然后再用一个变量 totalSum 记录整个数组的总和。
  3. 接下来将数组中的每个元素取相反数,再使用 Kadane 算法求出最小子数组和 minSum。这一步中,因为所有元素都取相反数,所以最小子数组和就变成了非最大子数组的最小子数组和。
  4. 最后用 totalSum 减去 minSum,和 maxSum1 取最大值,即为所求。

时间复杂度:O(n)。


原文地址: https://www.cveoy.top/t/topic/ffga 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录