这个问题是经典的最大子数组和问题,也称为 Kadane 算法。我们可以使用动态规划的方法来高效地解决它。以下是解决方案的 C++ 实现:
class Solution {
public:
vector<int> maxSubArray(vector<double>& nums) {
if (nums.empty()) return {};
double maxSum = nums[0], currentSum = nums[0];
int start = 0, end = 0, tempStart = 0;
for (int i = 1; i < nums.size(); i++) {
if (currentSum + nums[i] > nums[i]) {
currentSum += nums[i];
} else {
currentSum = nums[i];
tempStart = i;
}
if (currentSum > maxSum) {
maxSum = currentSum;
start = tempStart;
end = i;
}
}
return {start, end, maxSum};
}
};
这个算法的工作原理如下:
- 我们使用两个变量:
maxSum
记录到目前为止找到的最大和,currentSum
记录当前子数组的和。 - 我们还使用三个索引:
start
和end
记录最大和子数组的起始和结束位置,tempStart
记录当前子数组的起始位置。 - 我们从数组的第二个元素开始遍历:
- 如果将当前元素加入到现有的子数组中会使和增加,我们就将其加入。
- 否则,我们开始一个新的子数组,从当前元素开始。
- 每次我们更新
currentSum
后,我们都会检查它是否大于maxSum
。如果是,我们更新maxSum
并记录新的起始和结束位置。 - 最后,我们返回一个包含最大和子数组的起始位置、结束位置和最大和的向量。
这个算法的时间复杂度是 O(n),其中 n 是数组的长度。它只需要遍历数组一次,因此是非常高效的。空间复杂度是 O(1),因为我们只使用了几个额外的变量,不管输入数组的大小如何。
这个算法可以处理包含正数、负数和零的实数序列。它也可以处理全负数的情况,在这种情况下,它会返回数组中最大的单个元素。