热门标签 | 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;
}




推荐阅读
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • Java 类成员初始化顺序与数组创建
    本文探讨了Java中类成员的初始化顺序、静态引入、可变参数以及finalize方法的应用。通过具体的代码示例,详细解释了这些概念及其在实际编程中的使用。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 在金融和会计领域,准确无误地填写票据和结算凭证至关重要。这些文件不仅是支付结算和现金收付的重要依据,还直接关系到交易的安全性和准确性。本文介绍了一种使用C语言实现小写金额转换为大写金额的方法,确保数据的标准化和规范化。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!-----&# ... [详细]
  • 深入理解Java泛型:JDK 5的新特性
    本文详细介绍了Java泛型的概念及其在JDK 5中的应用,通过具体代码示例解释了泛型的引入、作用和优势。同时,探讨了泛型类、泛型方法和泛型接口的实现,并深入讲解了通配符的使用。 ... [详细]
  • 本文探讨了《魔兽世界》中红蓝两方阵营在备战阶段的策略与实现方法,通过代码展示了双方如何根据资源和兵种特性进行战士生产。 ... [详细]
  • Codeforces Round #566 (Div. 2) A~F个人题解
    Dashboard-CodeforcesRound#566(Div.2)-CodeforcesA.FillingShapes题意:给你一个的表格,你 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 数据管理权威指南:《DAMA-DMBOK2 数据管理知识体系》
    本书提供了全面的数据管理职能、术语和最佳实践方法的标准行业解释,构建了数据管理的总体框架,为数据管理的发展奠定了坚实的理论基础。适合各类数据管理专业人士和相关领域的从业人员。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本题通过将每个矩形视为一个节点,根据其相对位置构建拓扑图,并利用深度优先搜索(DFS)或状态压缩动态规划(DP)求解最小涂色次数。本文详细解析了该问题的建模思路与算法实现。 ... [详细]
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社区 版权所有