热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

判断数组是否全为0_连续子数组的最大和的解题思路及代码方法一_动态规划

本文介绍了判断数组是否全为0以及求解连续子数组的最大和的解题思路及代码方法一,即动态规划。通过动态规划的方法,可以找出连续子数组的最大和,具体思路是尽量选择正数的部分,遇到负数则不选择进去,遇到正数则保留并继续考察。本文给出了状态定义和状态转移方程,并提供了具体的代码实现。
8b77e8d0d3fee4c9688262f4b74cb009.png

题目描述

HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1)

示例

输入:

[1,-2,3,10,-4,7,2,-5]

输出:

18

解题思路及代码

方法一:动态规划

我们想找出连续子数组的最大和,很明显我们肯定要尽量选取正数的部分。当某个连续的部分和值为负数,我们肯定不会选择进去,因为这一部分肯定会让和值减小。而遇到某个连续部分和值为正数,我们就应该将这一部分保留,继续考察。

具体动态规划的方法为:

状态定义:dp[i]表示以i结尾的连续子数组的最大和。所以最终要求dp[n-1]

状态转移方程:dp[i] = max(array[i], dp[i-1]+array[i])

解释:如果当前元素为整数,并且dp[i-1]为负数,那么当然结果就是只选当前元素

技巧:这里为了统一代码的书写,定义dp[i]表示前i个元素的连续子数组的最大和,结尾元素为array[i-1]

代码如下:

class Solution {
public:int FindGreatestSumOfSubArray(vector array) {int sz &#61; array.size();vector dp(sz&#43;1, 1);dp[0] &#61; 0; // 表示没有元素int ret &#61; array[0];for (int i&#61;1; i<&#61;sz; &#43;&#43;i) {dp[i] &#61; max(array[i-1], dp[i-1]&#43;array[i-1]);ret &#61; max(ret, dp[i]);}return ret;}
};

时间复杂度&#xff1a;O(n)

空间复杂度&#xff1a;O(n)

c&#43;&#43;中vector的初始化有五种方式&#xff0c;举例说明如下&#xff1a;
&#xff08;1&#xff09; vector a(10); //定义了10个整型元素的向量&#xff08;尖括号中为元素类型名&#xff0c;它可以是任何合法的数据类型&#xff09;&#xff0c;但没有给出初值&#xff0c;其值是不确定的。
&#xff08;2&#xff09;vector a(10,1); //定义了10个整型元素的向量,且给出每个元素的初值为1
&#xff08;3&#xff09;vector a(b); //用b向量来创建a向量&#xff0c;整体复制性赋值
&#xff08;4&#xff09;vector a(b.begin(),b.begin&#43;3); //定义了a值为b中第0个到第2个&#xff08;共3个&#xff09;元素 &#xff08;5&#xff09;int b[7]&#61;{1,2,3,4,5,9,8};
vector a(b,b&#43;7); //从数组中获得初值

方法二&#xff1a;对方法一的优化&#xff0c;降低空间复杂度

思想很简单&#xff0c;就是对下标为i的元素array[i]&#xff0c;先试探的加上array[i], 如果和为负数&#xff0c;显然&#xff0c;以i结尾的元素对整个结果不作贡献。 具体过程&#xff1a;

  1. 初始化&#xff1a;维护一个变量tmp &#61; 0
  2. 如果tmp&#43;array[i] <0, 说明以i结尾的不作贡献&#xff0c;重新赋值tmp &#61; 0
  3. 否则更新tmp &#61; tmp &#43; array[i] 最后判断tmp是否等于0&#xff0c; 如果等于0&#xff0c; 说明数组都是负数&#xff0c;选取一个最大值为答案。

代码如下&#xff1a;

class Solution {
public:int FindGreatestSumOfSubArray(vector array) {int ret &#61; array[0];int tmp &#61; 0;for (const int k : array) {if (tmp &#43; k <0) {tmp &#61; 0;}else {tmp &#43;&#61; k;}ret &#61; max(ret, tmp);}if (tmp !&#61; 0)return ret;return *max_element(array.begin(), array.end());}
};

时间复杂度&#xff1a;O(n)

空间复杂度&#xff1a;O(1)

另外&#xff0c;类似思想使用 Java 的代码为&#xff1a;

public int FindGreatestSumOfSubArray(int[] nums) {if (nums &#61;&#61; null || nums.length &#61;&#61; 0)return 0;int greatestSum &#61; Integer.MIN_VALUE;int sum &#61; 0;for (int val : nums) {sum &#61; sum <&#61; 0 ? val : sum &#43; val;greatestSum &#61; Math.max(greatestSum, sum);}return greatestSum;
}




推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • LeetCode笔记:剑指Offer 41. 数据流中的中位数(Java、堆、优先队列、知识点)
    本文介绍了LeetCode剑指Offer 41题的解题思路和代码实现,主要涉及了Java中的优先队列和堆排序的知识点。优先队列是Queue接口的实现,可以对其中的元素进行排序,采用小顶堆的方式进行排序。本文还介绍了Java中queue的offer、poll、add、remove、element、peek等方法的区别和用法。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
author-avatar
邱文馨4966
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有