给定一个实数序列,设计一个最有效的算法,找到一个总和最大的区间

这个问题是经典的最大子数组和问题,也称为 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};
    }
};

这个算法的工作原理如下:

  1. 我们使用两个变量:maxSum 记录到目前为止找到的最大和,currentSum 记录当前子数组的和。
  2. 我们还使用三个索引:startend 记录最大和子数组的起始和结束位置,tempStart 记录当前子数组的起始位置。
  3. 我们从数组的第二个元素开始遍历:
    • 如果将当前元素加入到现有的子数组中会使和增加,我们就将其加入。
    • 否则,我们开始一个新的子数组,从当前元素开始。
  4. 每次我们更新 currentSum 后,我们都会检查它是否大于 maxSum。如果是,我们更新 maxSum 并记录新的起始和结束位置。
  5. 最后,我们返回一个包含最大和子数组的起始位置、结束位置和最大和的向量。

这个算法的时间复杂度是 O(n),其中 n 是数组的长度。它只需要遍历数组一次,因此是非常高效的。空间复杂度是 O(1),因为我们只使用了几个额外的变量,不管输入数组的大小如何。

这个算法可以处理包含正数、负数和零的实数序列。它也可以处理全负数的情况,在这种情况下,它会返回数组中最大的单个元素。

相关推荐
Swift社区3 分钟前
LeetCode 448 - 找到所有数组中消失的数字
算法·leetcode·职场和发展
OKkankan10 分钟前
二叉搜索树
c语言·数据结构·c++·算法
茶猫_15 分钟前
C++学习记录-旧题新做-字符串压缩
c语言·c++·学习·算法·leetcode
拉姆哥的小屋16 分钟前
从原子到性能:机器学习如何重塑双金属催化剂的设计范式
人工智能·python·算法·机器学习
leoufung16 分钟前
LeetCode 162:寻找峰值的二分搜索思想与区间不变式分析
算法·leetcode·职场和发展
Non importa21 分钟前
用滑动窗口代替暴力枚举:算法新手的第二道砍
java·数据结构·c++·学习·算法·leetcode·哈希算法
free-elcmacom24 分钟前
机器学习进阶<10>分类器集成:集成学习算法
python·算法·机器学习·集成学习
月明长歌35 分钟前
【码道初阶】【LeetCode 160】相交链表:让跑者“起跑线对齐”的智慧
java·算法·leetcode·链表
beordie.cloud39 分钟前
LeetCode 49. 字母异位词分组 | 从排序到计数的哈希表优化之路
算法·leetcode·散列表
共享家95271 小时前
每日一题(一)
算法