【算法分析与设计】最大子数组和

题目

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

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

示例

示例 1:

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

示例 2:

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

示例 3:

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

方案一(暴力破解)

思路

三层for循环,

        第一层:字段最左边坐标

        第二层:子段最右边坐标

        第三层:字段从左到右遍历

代码实现.

(这是书上的代码,默认是所有都是负数的情况下,最大值为0);

class Solution {public int maxSubArray(int[] nums) {int sum=0;for(int i=0;i<nums.length;i++){for(int j=0;j<nums.length;j++){int thisSum=0;for(int k=i;k<=j;k++){thisSum=thisSum+nums[k];if(thisSum>sum){sum=thisSum;}}}}return sum;}
}

方案二(分治递归)

思路

分治法不是这道题时间复杂度最优的解法,但可能是这道题最有挑战性的解法。分治法的算法设计、时间复杂度分析都并不容易。这个解法建议详细阅读,赶时间的同学可以先跳到下一个解法。

既然是分治法,我们首先要考虑的就是如何「分」。要计算数组 nums 的最大子数组和,我们从数组中间将数组一分为二,则子数组可能位于:

  • 左半部分数组

  • 右半部分数组

  • 中间(穿过中间线)

将数组一分为二后,子数组可能位于的三个位置

其中,位于左半部分数组和位于右半部分数组的子数组,可以通过递归调用继续求解,这便是分治法的「治」。

对于穿过中间线的子数组,我们可以分别计算「中间线左侧的最大子数组和」以及「中间线右侧的最大子数组和」,把它们相加就得到「穿过中间线的最大子数组和」。

穿过中间线的子数组分左右两半计算

代码实现

public int maxSubArray(int[] nums) {return maxSubArray(nums, 0, nums.length - 1);
}// 计算 nums[lo..hi] 的最大子数组和
// lo 表示 low,hi 表示 high
private int maxSubArray(int[] nums, int lo, int hi) {if (hi < lo) {return Integer.MIN_VALUE;} else if (hi == lo) {return nums[lo];}int mid = lo + (hi - lo) / 2;// 计算左半部分数组的最大子数组和int max_left = maxSubArray(nums, lo, mid);// 计算右半部分数组的最大子数组和int max_right = maxSubArray(nums, mid+1, hi);// 计算穿过中间线的子数组的最大和int max_mid = maxMidSubArray(nums, lo, mid, hi);return Math.max(max_left, Math.max(max_mid, max_right));
}private int maxMidSubArray(int[] nums, int lo, int mid, int hi) {// 计算中间线左侧(且紧挨着中间线)的最大子数组和int max_mid_left = 0;if (mid >= lo) {max_mid_left = nums[mid];int sum = 0;for (int i = mid; i >= lo; i--) {sum += nums[i];max_mid_left = Math.max(max_mid_left, sum);}}// 计算中间线右侧(且紧挨着中间线)的最大子数组和int max_mid_right = 0;if (mid + 1 <= hi) {max_mid_right = nums[mid+1];int sum = 0;for (int i = mid + 1; i <= hi; i++) {sum += nums[i];max_mid_right = Math.max(max_mid_right, sum);}}return max_mid_left + max_mid_right;
}

方案三(动态规划)

算法分析

  1. 初始化两个变量 maxtemp 为数组第一个元素 nums[0]。其中,max 用于记录全局最大子数组和,而 temp 用于记录当前子数组的和。

  2. 使用一个循环遍历数组 nums,从第一个元素开始。

  3. 在循环中,对于当前元素 nums[i],更新 temp 的值,使其成为当前元素 nums[i] 和之前子数组的和中的较大者。这是通过 temp = Math.max(temp + nums[i], nums[i]) 实现的。这一步表示考虑是否将当前元素加入当前的子数组,或者重新开始一个新的子数组。

  4. 在每一步中,都更新 max 的值,将其设为 tempmax 中的较大者。这样,max 始终记录着全局最大子数组和。

  5. 循环结束后,max 中存储的就是整个数组中的最大子数组和

代码实现

class Solution {public int maxSubArray(int[] nums) {int max=nums[0];int temp=0;int flag=0;for(int i=0;i<nums.length;i++){temp=Math.max(temp+nums[i],nums[i]);max=Math.max(temp,max);}return max;}}

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

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

相关文章

硬核加码!星邦蓝助力全球运力最大固体火箭“引力一号”海上首飞

继助力我国最大固体运载火箭“力箭一号”首飞后&#xff0c;星邦蓝再次有幸参与和见证了全球运力最大的固体火箭“引力一号”首次成功发射。 今日&#xff0c;全球运力最大的固体火箭“引力一号”从山东海阳附近海域完成首次发射&#xff0c;刷新世界最大固体运载火箭纪录&…

关于鸿蒙的ArkUI的自我理解

先不说好不好上手 一些软件必要的基础概念了解 ①瓦片地图 --无或未找到 ②视频播放功能 --未找到能播放直播流&#xff08;找到个 ohos/ijkplayer不知如何&#xff09; ③支付功能 微信无 支付宝的是java代码写得&#xff0c;AskUI中如何调用 ④推送 --自己应该有吧 ⑤长…

【一周安全资讯0106】国家标准《信息安全技术 网络安全信息报送指南》正式发布;全球1100万SSH服务器面临“水龟攻击”威胁

要闻速览 1、国家标准GB/T 43557-2023《信息安全技术 网络安全信息报送指南》发布 2、《未成年人网络保护条例》元旦起施行 织密未成年人网络保护立体“安全网” 3、深圳证监局&#xff1a;证券期货经营机构应建立健全网络安全应急处置机制 4、黑客大规模恶意注册与ChatGPT相似…

全面解析微服务

导读 微服务是企业应用及数据变革升级的利器&#xff0c;也是数字化转型及运营不可或缺的助产工具&#xff0c;企业云原生更离不开微服务&#xff0c;同时云原生的既要最大化发挥微服务的价值&#xff0c;也要最大化弥补微服务的缺陷。本文梳理了微服务基础设施组件、服务网格、…

C++重新认知:拷贝构造函数

一、什么是拷贝构造函数 对于简单变量来说&#xff0c;可以轻松完成拷贝。 int a 10; int b a;但是对于复杂的类对象来说&#xff0c;不仅存在变量成员&#xff0c;也存在各种函数等。因此相同类型的类对象是通过拷贝构造函数来完成复制过程的。 #include<iostream>…

基于 TensorFlow.js 构建垃圾评论检测系统

基于 TensorFlow.js 构建垃圾评论检测系统。 准备工作 在过去的十年中,Web 应用变得越来越具有社交性和互动性,而即使是在中等热门的网站上,也有数万人可能实时对多媒体、评论等的支持。这也让垃圾内容发布者有机会滥用此类系统,将不太令人满意的内容与其他人撰写的文章、视…

小程序必看系列!什么是抖音小程序?抖音小程序怎么制作?

随着移动互联网的飞速发展&#xff0c;抖音已经成为了一个广受欢迎的短视频平台。在这个平台上&#xff0c;用户可以分享自己的生活点滴、表达自己的观点&#xff0c;甚至还能通过小程序来丰富自己的社交体验。那么&#xff0c;如何制作抖音小程序呢&#xff1f; 一、抖音小程…

5288 SDH/PDH数字传输分析仪

5288 SDH/PDH数字传输分析仪 数字通信测量仪器 5288 SDH/PDH数字传输分析仪为高性能手持式数字传输分析仪&#xff0c;符合ITU-T SDH/PDH技术规范和我国光同步传输网技术体制的规定,支持2.048、34.368、139.264Mb/s及155.520Mb/s传输速率的测试。可进行SDH/PDH传输设备和网络的…

云畅科技技术中心被认定为湖南省省级企业技术中心

近日&#xff0c;湖南省工业和信息化厅公布《2023年第二批湖南省省级企业技术中心(第29批)》&#xff0c;云畅科技技术中心作为研发设计型代表入选。 省级企业技术中心是强化企业技术创新主体地位&#xff0c;增强企业自主创新能力&#xff0c;推动工业企业高质量发展的一个重要…

SQL-分组查询

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;重拾MySQL &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出现错误&am…

turnjs实现翻书效果

需求&#xff1a;要做一个效果&#xff0c;类似于阅读器上的翻书效果。 咱们要实现这个需求就需要使用turnjs这个插件&#xff0c;他的官网是turnjs官网。 进入官网后可以点击 这个按钮去下载官网的demo。 这个插件依赖于jQuery&#xff0c;所以你的先安装jQuery. npm insta…

Unity URP下阴影锯齿

1.概述 在Unity开发的URP项目中出现阴影有明显锯齿。如下图所示&#xff1a; 并且在主光源的Shadow Type已经是Soft Shadows模式了。 2.URP Asset 阴影出现锯齿说明阴影质量不高&#xff0c;所以要先找到URP Asset文件进行阴影质量参数的设置。 1.打开PlayerSetting找到Graph…

代码签名证书怎么选择?软件开发者必看

随着互联网的高速发展&#xff0c;各种购物、资讯、社交类软件高速增长。而对于软件开发者来说&#xff0c;选择合适的代码签名证书来为软件进行数字签名、确保软件程序代码的完整性和软件的可信任性是很有必要的。但市场上有多种品牌、多种类型的代码签名证书可以选择&#xf…

03.阿里Java开发手册——OOP规约

【强制】避免通过一个类的对象引用访问此类的静态变量或静态方法&#xff0c;无谓增加编译器解析成本&#xff0c;直接用类名来访问即可。 【强制】所有的覆写方法&#xff0c;必须加Override 注解。 说明&#xff1a;getObject()与 get0bject()的问题。一个是字母的 O&#x…

vue前端开发自学,插槽练习,同时渲染父子组件的数据信息

vue前端开发自学,插槽练习,同时渲染父子组件的数据信息&#xff01; 如果想在slot插槽出口里面&#xff0c;同时渲染出来&#xff0c;来自父组件的数据&#xff0c;和子组件自身的数据呢。又有点绕口了。vue官方给的解决办法是。需要借助于&#xff0c;父组件的自定义属性。 …

第二百五十九回

文章目录 知识回顾示例代码经验总结 我们在上一章回中介绍了MethodChannel的使用方法&#xff0c;本章回中将介绍EventChannel的使用方法.闲话休提&#xff0c;让我们一起Talk Flutter吧。 知识回顾 我们在前面章回中介绍了通道的概念和作用&#xff0c;并且提到了通道有不同的…

本地部署Canal笔记-实现MySQL与ElasticSearch7数据同步

背景 本地搭建canal实现mysql数据到es的简单的数据同步&#xff0c;仅供学习参考 建议首先熟悉一下canal同步方式&#xff1a;https://github.com/alibaba/canal/wiki 前提条件 本地搭建MySQL数据库本地搭建ElasticSearch本地搭建canal-server本地搭建canal-adapter 操作步骤…

24-1-9 bilibilic++音视频

下午两点面试&#xff0c;面试官迟到了一会&#xff0c;面试官人很好&#xff0c;整体面试经历很不错&#xff0c;但是我人太紧张了&#xff0c;基础知识掌握的深度不够&#xff0c;没有深挖&#xff0c; 是做音视频的底层相关的&#xff0c; 实习要求只要每天打卡够九个小时就…

禁用code server docker容器中的工作区信任提示

VSCode 添加受限模式&#xff0c;主要是防止自动运行代码的&#xff0c;比如在vscode配置的task和launch参数是可以运行自定义代码的。如果用VScode打开未知的工程文件就有可能直接运行恶意代码。 但是当我们的实验基础模板文件可控的情况下&#xff0c;要想禁用code server do…

vue前端开发自学,组件的嵌套关系demo

vue前端开发自学,组件的嵌套关系demo!今天开始分享的&#xff0c;前端开发经常用到的&#xff0c;组件的嵌套关系案例代码。下面先给大家看看&#xff0c;代码执行效果。 如图&#xff0c;这个是代码执行后&#xff0c;的效果布局&#xff01; 下面给大家贴出来源码。方便大家…