当前位置: 首页 > news >正文

经典算法 最大子段和

题目描述

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

子数组是数组中的一个连续部分。当所有整数均为负整数时定义其最大子段和为0.

示例 1:

输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。

示例 2:

输入:nums = [-1]
输出:0

示例 3:

输入:nums = [5,4,-1,7,8]
输出:23

c++代码

贪心法

#include<bits/stdc++.h>

using namespace std;

int maxSubArray(vector<int>& nums) {
    int ans = 0, mid = 0;
    for (int x : nums) {
        mid += x;
        if (mid < 0) mid = 0;
        else ans = max (ans, mid);
    }
    return ans;
}

int main() {
    int n;
    cin >> n;
    vector<int> nums(n);
    for (int i = 0; i < n; i++) {
        cin >> nums[i];
    }
    cout << maxSubArray(nums);
    return 0;
}//by wqs

单调队列法

#include<bits/stdc++.h>

using namespace std;

int maxSubArray(vector<int>& nums) {
    int n = nums.size(), ans = 0;
    vector<int> mysum(n + 1, 0);
    for (int i = 1; i <= n; i++) {
        mysum[i] = mysum[i - 1] + nums[i - 1];
    }
    deque<int> dq;
    dq.push_back(0);
    for (int i = 1; i <= n; i++) {
        ans = max(ans, mysum[i] - mysum[dq.front()]);
        while(!dq.empty() && mysum[dq.back()] > mysum[i]) dq.pop_back();
        dq.push_back(i);
    }
    return ans;
}

int main() {
    int n;
    cin >> n;
    vector<int> nums(n);
    for (int i = 0; i < n; i++) {
        cin >> nums[i];
    }
    cout << maxSubArray(nums);
    return 0;
}//by wqs
http://www.dtcms.com/a/106706.html

相关文章:

  • UE5学习笔记 FPS游戏制作37 蓝图函数库 自己定义公共方法
  • uni-app 框架 调用蓝牙,获取 iBeacon 定位信标的数据,实现室内定位场景
  • 求解传递闭包
  • 花洒洗澡完毕并关闭后过段时间会突然滴水的原因探究
  • 快速在 Windows 平台上高效安装flash_attn库
  • 【C++重点】std::map
  • STM32入门学习笔记(持续更新)
  • 如何使用Python通过STOMP协议接收ActiveMQ消息
  • The Rust Programming Language 学习 (九)
  • zkTLS 工作原理
  • 【C++初阶】--- string类
  • 23种设计模式-结构型模式-代理
  • jvm 的attach 和agent机制
  • 小白编程教程,编程设计中的三大程序控制结构,扣子平台的循环节点如何使用?扣子免费系列教程(26)
  • 质量和工艺之间的区别与联系?
  • 介绍 Docker 的基本概念和优势,以及在应用程序开发中的实际应用及数组讲解
  • 玛卡巴卡的k8s知识点问答题(七)
  • 2025年2月一区SCI-壮丽细尾鹩莺算法Superb Fairy-wren Optimization-附Matlab免费代码
  • 【C++继承】关于继承的细节分析
  • yolo11参数信息
  • 学习总结 网格划分+瞬态求解设置
  • vector模拟实现2
  • Windows系统服务器安装Office Online Server
  • C语言复习笔记--指针(2)
  • 详解 MySQL InnoDB 引擎中的聚簇索引和非聚簇索的区别
  • OpenCV边界填充方法详解
  • Python入门(6):面向对象编程(OOP)
  • Smith Chart阻抗匹配
  • elasticsearch 7.17 索引模板
  • 一段式端到端自动驾驶:UniAD:Planning-oriented Autonomous Driving