给定一个长度为 n 的环形整数数组 nums 返回 nums 的非空 子数组 的最大可能和 。环形数组 意味着数组的末端将会与开头相连呈环状。形式上 numsi 的下一个元素是 numsi + 1 n numsi 的前一个元素是 numsi - 1 + n n 。子数组 最多只能包含固定缓冲区 nums 中的每个元素一次。形式上对于子数组 numsi numsi + 1 numsj 不存在
思路:
- 如果最大子数组不跨越数组首尾,则直接使用普通的最大子数组和算法即可。
- 如果最大子数组跨越数组首尾,则意味着子数组包含了数组中间的某些元素,可以转化为求一个非最大子数组的最小子数组和,然后用总和减去这个最小子数组和即可得到最大子数组和。
具体实现:
- 首先使用 Kadane 算法求出最大子数组和 maxSum1。这一步和普通的最大子数组和问题相同。
- 然后再用一个变量 totalSum 记录整个数组的总和。
- 接下来将数组中的每个元素取相反数,再使用 Kadane 算法求出最小子数组和 minSum。这一步中,因为所有元素都取相反数,所以最小子数组和就变成了非最大子数组的最小子数组和。
- 最后用 totalSum 减去 minSum,和 maxSum1 取最大值,即为所求。
时间复杂度:O(n)。
原文地址: https://www.cveoy.top/t/topic/ffga 著作权归作者所有。请勿转载和采集!