从零开始写算法——普通数组类题:最大子数组和 & 合并区间(C++)

在刷算法时,有两类题非常高频:连续子数组相关问题区间处理问题。本文将通过两道典型题目来理解它们的本质思路与代码实现。


一、最大子数组和(Maximum Subarray)

题目

给你一个整数数组 nums,请找出一个具有最大和的连续子数组(至少包含一个元素),返回其最大和。


思路解析

采用 前缀和 + 最小前缀和 的思想(将它转化为买卖股票机问题):

当前前缀和 - 历史最小前缀和 = 当前能得到的最大连续子数组和

  • pre_sum 表示当前的前缀和

  • pre_sum_min 记录遇到的最小前缀和

  • 每次更新结果 ans = max(ans, pre_sum - pre_sum_min)

  • 不断更新 pre_sum_min

这就像"低买高卖股票问题":

前面最低的时候买入,现在卖出,赚得最多


✔代码实现

cpp 复制代码
class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        // 思路: 利用前缀和 将其转化为一个买卖股票机的问题
        int ans = INT_MIN;
        int pre_sum_min = 0;
        int pre_sum = 0;
        for (int x : nums) {
            pre_sum += x;
            ans = max(ans, pre_sum - pre_sum_min);
            pre_sum_min = min(pre_sum, pre_sum_min);
        }
        return ans;
    }
};

复杂度分析

项目 数值
时间复杂度 O(n)
空间复杂度 O(1)
思想核心 前缀和 & 动态更新最优

二、合并区间(Merge Intervals)

题目

给定一组区间,将重叠区间合并为一个。


思路解析

基本策略:

  1. 先按区间起点排序

  2. 维护当前合并区间 [start, end]

  3. 遍历过程中判断是否重叠

    • 如果重叠:更新 end = max(end, 当前区间的end)

    • 如果不重叠:将已有区间压入结果,新建区间

注意:最后一个区间需要手动加入答案。


✔代码实现

cpp 复制代码
class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        // 思路: 先排序,然后通过start 和 end 比较更新区间,加入答案,别忘了最后单独加入,因为最后构成不了不符合if的条件
        vector<vector<int>> ans;
        sort(intervals.begin(), intervals.end());
        int start = intervals[0][0];
        int end = intervals[0][1];
        for (int i = 1; i < intervals.size(); ++i) {
            if (intervals[i][0] > end) {
                ans.push_back({start, end});
                start = intervals[i][0];
                end = intervals[i][1];
            }
            else {
                end = max(end,intervals[i][1]);
            }
        }
        ans.push_back({start, end});
        return ans;
    }
};

复杂度分析

项目 数值
排序开销 O(n log n)
遍历开销 O(n)
总复杂度 O(n log n)
技巧核心 排序 + 贪心合并

总结 & 对比

题目 核心策略 是否排序 是否贪心 难点
最大子数组和 前缀和 & 动态更新最低点 把连续子数组转成差值最大问题
合并区间 排序 + 贪心扩展区间 细节处理 & 最后区间别漏

小结

最大子数组和 ------ "找最低点买入,当前卖出"

合并区间 ------ "先排好队,再合并重叠的人"

相关推荐
AI视觉网奇20 小时前
ue5 插件 WebSocket
c++·ue5
左直拳20 小时前
将c++程序部署到docker
开发语言·c++·docker
恒者走天下20 小时前
AI智能体通讯项目(底层AI通讯协议实现)
c++
英雄各有见20 小时前
Chapter 5.1.1: 编写你的第一个GPU kernel——Cuda Basics
c++·gpu·cuda·hpc
清铎21 小时前
leetcode_day12_滑动窗口_《绝境求生》
python·算法·leetcode·动态规划
linweidong21 小时前
嵌入式电机:如何在低速和高负载状态下保持FOC(Field-Oriented Control)算法的电流控制稳定?
stm32·单片机·算法
梵尔纳多21 小时前
OpenGL着色器语言(GLSL)
c++·opengl·着色器
踩坑记录21 小时前
leetcode hot100 42 接雨水 hard 双指针
leetcode
net3m3321 小时前
单片机屏幕多级菜单系统之当前屏幕号+屏幕菜单当前深度 机制
c语言·c++·算法
mmz120721 小时前
二分查找(c++)
开发语言·c++·算法