力扣 53. 最大子数组和 --- C语言求解

news2025/1/12 12:22:43

 题目描述:

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

子数组 是数组中的一个连续部分。

题解:

此题可以用动态规划和分治法。

方法1. 动态规划

思路:动态规划就是把一个规模比较大的问题分成几个规模比较小的问题,然后由小的问题推导出大的问题。这个问题的小问题可以是--------让以每个元素为结尾找连续子数组的最大和作为子问题。假如输入数组是 [-2,1,-3,4,-1,2,1,-5,4] ,我们可以求出以下子问题:

子问题 1:以 -2 结尾的连续子数组的最大和是多少;
子问题 2:以 1 结尾的连续子数组的最大和是多少;
子问题 3:以 -3 结尾的连续子数组的最大和是多少;
.............

求出所有子问题后再求所有子问题的最大值即为题解。

子问题 1 以 -2 结尾的连续子数组是[-2],最大和即为 -2

子问题 2 以 1 结尾的连续子数组有 [-2,1] 和 [1] 。其中 [-2,1] 就是在「子问题 1」的后面加上 1 得到。但是前一个子问题小于0,即-2 + 1 = -1 <1 ,故舍去前一个子问题。因此「子问题 2」 的答案是 1。

子问题3 以-3结尾的连续子数组有[-3], [1, -3], [-2, 1, -3]. 其中最大和是 1+(-3). 前一个子问题小于0,故子问题3就是子问题2后面加-3.

根据上面分析可以得到下面的结论:

当 前一个子问题的值大于0时,目前的子问题就是前一个子问题加当前位置的元素值;而  前一个子问题的值小于0时,目前子问题的最大和就是当前位置的元素值。

根据上面分析定义状态方程。

令dp[i]表示以num[i]结尾连续子数组的最大和

方程可以定义如下:

dp[i] = max\left \{ dp[i-1]+nums[i], nums[i] \right \}

可以用一个 dp数组来保存 dp[i] 的值,用一个循环求出最大 dp[i]。如下代码。

int maxSubArray(int* nums, int numsSize){
    int dp[numsSize];
    memset(dp, 0, sizeof(int)*numsSize);
    dp[0] = nums[0];
    int max = nums[0];
    for(int i=1;i<numsSize;++i)
    {
        if(dp[i-1]>0){dp[i] = dp[i-1]+nums[i];}
        else{dp[i] = nums[i];}
        
    }
    for(int i=0; i<numsSize; ++i)
    {
        if(dp[i]>max)
            max = dp[i];
    }
    return max;

}

而dp[i]只和dp[i-1]有关,故定义一个变量记录dp[i-1],并使用一个变量来记录最大的 dp[i] 是最佳的方案,可以让复杂度降为O(1).

int maxSubArray(int* nums, int numsSize){
    int max = nums[0];
    int pre = 0;
    for(int i=0; i<numsSize; ++i)
    {
        if(nums[i]>=pre+nums[i])
            pre = nums[i];
        else
            pre += nums[i];

        if(pre>max)
            max=pre;
    }
    return max;

}

方法2. 分治法

该方法使用递归。

对于一个区间 [l,r],我们取m=(l+r)/2 ,对区间 [l,m]和 [m+1,r]分治求解。当递归逐层深入直到区间长度缩小为 1的时候,递归开始回升。这个时候我们考虑如何通过 [l,m] 区间的信息和 [m+1,r] 区间的信息合并成区间 [l,r]的信息。其实我们要求的就是每个子区间的最大值。

由于最大子区间是连续的,故给每个子区间设置左子区间最大值右子区间最大值,使其在合并的时候能够连接起来。当前区间的最大值就是取【左子区间最大值,右子区间最大值,左子区间的右子区间最大值+右子区间的左子区间最大值】三者最大值。

mSum = fmax(fmax(l.mSum, r.mSum), l.rSum+r.lSum);

左子区间最大值是取其【左子区间的左区间最大值,左子区间的和+右子区间的左子区间最大值】两者最大值

lSum = fmax(l.lSum, l.iSum+r.lSum);

右子区间最大值是取其【右子区间的右区间最大值,右子区间的和+左子区间的右子区间最大值】两者最大值

rSum = fmax(r.rSum, l.rSum+r.iSum);

其中的含义比较绕,需要花时间才能想明白............

lSum 表示[l,r] 内以 l 为左端点的最大子段和
rSum 表示[l,r] 内以 r 为右端点的最大子段和
mSum 表示[l,r] 内的最大子段和
iSum 表示[l,r] 的区间和

分治法的代码如下:

typedef struct status
{
    int lSum;
    int rSum;
    int mSum;
    int iSum;
}Status;

Status get(Status l, Status r)
{
    int lSum = fmax(l.lSum, l.iSum+r.lSum);
    int rSum = fmax(r.rSum, l.rSum+r.iSum);
    int mSum = fmax(fmax(l.mSum, r.mSum), l.rSum+r.lSum);
    int iSum = l.iSum + r.iSum;
    return (Status){lSum, rSum, mSum, iSum};
}
Status part(int* a, int l, int r)
{
    if(l==r)
    {
        return (Status){a[l], a[l], a[l], a[l]};
    }
    int mid = (l+r)>>1;

    Status lSub = part(a, l, mid);
    Status rSub = part(a, mid+1, r);
    return get(lSub, rSub);
}
int maxSubArray(int* nums, int numsSize){
    return part(nums, 0, numsSize-1).mSum;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/24745.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《深度学习进阶 自然语言处理》第七章:seq2seq介绍

文章目录7.1 seq2seq模型介绍7.1.1 seq2seq的原理7.1.2 时序数据转换简单举例7.2 seq2seq模型实现7.3 seq2seq模型改进7.3.1 反转输入数据(Reverse)7.3.2 偷窥(Peeky)7.4 seq2seq模型的应用7.5 总结之前文章链接&#xff1a; 开篇介绍&#xff1a;《深度学习进阶 自然语言处理…

MySQL Hash Join前世今生

GreatSQL社区原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。GreatSQL是MySQL的国产分支版本&#xff0c;使用上与MySQL一致。作者&#xff1a;nw MySQL Hash Join前世今生 因工作需要&#xff0c;对MySQL Hash Join的内部实现做了一些探索和实践&#x…

【Hack The Box】linux练习-- Mango

HTB 学习笔记 【Hack The Box】linux练习-- Mango &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月17日&#x1f334; &#x1f36…

01 基于yum方式部署Kubernetes集群

文章目录1.实验环境准备2.部署单节点的etcd1.在192.168.221.133节点安装etcd服务2.修改etcd的配置文件3.启动etcd并设置开机自启动4.检查集群的健康状态5.操作etcd服务3. master 组件部署1.在192.168.221.133节点安装master服务2.配置apiserver组件3.配置master的组件4.启动服务…

m基于MIMO中继通信和非规则LDPC编译码的matlab仿真,其中波束形成为SVD,MMSE,中继包括AF,DF,CF

目录 1.算法概述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法概述 即在非规则LDPC下&#xff0c;且源节点1个&#xff0c;中继一个&#xff0c;目标节点一个&#xff0c;天线也是1的情况对比三种中继协作协议的误码率。 做非规则LDPC码的以编码协作形…

computed计算方法不被调用的原因;只有在使用时才会被调用

目录 一、问题 二、解决方法 三、总结 一、问题 1.需求&#xff1a;根据组件外部一个变量的值来确定 组件内部的操作。组件外部可以更改filetime的值&#xff0c;filetime有值时这个界面可以操作&#xff0c;否则不可以操作。 我一想 用computed就可以了呀&#xff0c;动态…

Rockwell EDI 850 采购订单报文详解

罗克韦尔&#xff08;Rockwell&#xff09;自动化(中国)有限公司(NYSE: ROK)是全球最大的致力于工业自动化与信息化的公司&#xff0c;致力于帮助客户提高生产力&#xff0c;以及世界可持续发展。罗克韦尔自动化总部位于美国威斯康星州密尔沃基市&#xff0c;在全球80多个国家设…

超级明星们的人物化身 NFT 将来到 The Sandbox 元宇宙

超级明星队 NFT 将在 The Sandbox 的全球运动村体验中亮相&#xff01; ​ The Sandbox 与 Web3 公司 Forj 达成合作&#xff0c;还获得了独特的 BAYC 无聊猿人物化身的授权。 NFTSTAR 在 The Sandbox 建造了新的体验&#xff0c;巴西足球明星内马尔&#xff08;Neymar JR.&am…

高项 质量管理论文

三个过程 项目质量管理包括执行组织确定质量政策、目标与职责的各过程和活动&#xff0c;从而使项目满足其预定的需求。项目质量管理在项目环境内使用政策和程序&#xff0c;实施组织的质量管理体系&#xff1b;并以执行组织的名义&#xff0c;适当支持持续的过程改进活动。项目…

【408专项篇】C语言笔记-第五章(一维数组与字符数组)

第五章&#xff1a;一维数组与字符数组 第一节&#xff1a;一维数组 1. 数组的定义 C语言提供的数组&#xff0c;通过一个符号来访问多个元素。 特点&#xff1a; 具有相同的数据类型。使用过程中需要保留原始数据。 数组是构造数据类型。所谓数组&#xff0c;是指一组具…

深入理解Python生成器和yield

深入理解Python生成器和yield 我在《Python性能优化指南–让你的Python代码快x3倍的秘诀》中有提到&#xff0c;在处理大文件或大数据集时用生成器可以提高性能。很多朋友会问&#xff1a;“为什么用生成器就能提升性能呢&#xff1f;”。今天&#xff0c;我就带大家深入看一…

Web2 vs. Web3,社交工具的发展会有什么变化?

社交&#xff0c;是不同主体传递、反馈社会信息的主要方式之一。从古代的飞鸽传书、近代的书信往来&#xff0c;到现代大家手机里都必不可少的社交 APP&#xff0c;人们对于社交的需求和实现方式都在不断更新和变化。 当前&#xff0c;Web2 社交赛道已经非常成熟。为吸引更多流…

前端文件流相关

XMLHttpRequest // XMLHttpRequest对象用于与服务器交互 // XMLHttpRequest可以在不刷新页面的情况下请求特定URL, 获取数据 // XMLHttpRequest属性responseType是一个枚举字符串值, 用于指定响应中包含的数据类型 // 如果将 responseType的值设置为空字符串, 则使用 text 作为…

Linux网络编程基础

Linux网络编程基础一、基础概念的介绍1.1 网卡的介绍1.2 mac地址 六个字节 48位1.3 ip地址 32位 四个字节 ipv41.4 端口二、网络模型2.1 OSI七层模型2.2 TCP/IP模型2.3 协议2.4 网络通信过程2.4 arp协议2.5 网络设计模式一、基础概念的介绍 1.1 网卡的介绍 1.2 mac地址 六个字…

开源轻量堡垒机——Teleport的安装配置和使用

一、堡垒机简介 1.1、现状 目前随着信息化的发展&#xff0c;越来越多的企业开始有更多的服务器、业务资源&#xff0c;有更多样化的员工&#xff0c;拥有更多的账号&#xff1b;导致访问混乱化&#xff0c;越权访问难以规范&#xff1b;甚至恶意命令攻击事件&#xff08;如删…

【数据结构】带头节点双向循环链表

目录 顺序表和链表的区别 带头双向循环链表分析 带头双向循环链表结构&#xff1a; 创建一个节点 哨兵位头节点 打印链表中的值 在pos前插入 删除pos位置的节点 尾插 尾删 头插&#xff1a; 头删 链表元素查找 总代码 List.h文件 List.c文件 test.c文件 顺序表和…

科技云报道:历经四年,RPA走向同质化?

科技云报道原创。 经过多年发展&#xff0c;全球RPA市场已经初具规模。 据Transparency Market Research研究预测&#xff0c;预计到2024年&#xff0c;全球RPA市场规模将达到50亿美元&#xff0c;实现61.3%的年复合增长率。 RPA在亚洲市场起步晚于欧美市场&#xff0c;但从2…

SpringCloud系列(二)Ribbon 负载均衡的原理及详细流程

关于负载均衡这个概念在上一篇文章中有所提到&#xff0c;在消费者远程调用之前有一个重要的环节就是负载均衡&#xff0c;那么为什么要进行负载均衡呢&#xff1f;其原理及实现流程如何&#xff1f;   其实 Ribbon 负载均衡可以认为是一种策略&#xff0c;也可以说是某种规则…

SpringBoot+Vue项目实现身体健康诊疗系统

文末获取源码 开发语言&#xff1a;Java 使用框架&#xff1a;spring boot 前端技术&#xff1a;JavaScript、Vue.js 、css3 开发工具&#xff1a;IDEA/MyEclipse/Eclipse、Visual Studio Code 数据库&#xff1a;MySQL 5.7/8.0 数据库管理工具&#xff1a;phpstudy/Navicat JD…

ajax尚硅谷笔记——跨域请求、axios发送ajax请求、jquery发送ajax请求

去恶补了ajax知识 一、ajax简介 1、ajax全称为Asynchronous JavaScript And XML&#xff0c;就是异步的JS 和XML 2、通过AJAX可以再浏览器中向服务器发送异步请求&#xff0c;最大的优势&#xff1a;无刷新获取数据 3、ajax不是新的编程语言&#xff0c;而是一种将现有的标准…