牛客剑指offer刷题动态规划篇

文章目录

      • 连续子数组的最大和
        • 题目
        • 思路
        • 代码实现
      • 连续子数组的最大和(二)
        • 题目
        • 思路
        • 代码实现

连续子数组的最大和

题目

给你一个整数数组 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
LeetCode链接

思路

以nums = [-2,1,-3,4,-1,2,1,-5,4]数据为例
采用动态规划的思想,将以上问题转化为如下子问题:

  1. 求以-2结尾的连续子数组的最大值;
  2. 求以1结尾的连续子数据的最大值;
  3. 求以-3结尾的连续子数组的最大值;
  4. 求以4结尾的连续子数组的最大值;
  5. 求以-1结尾的连续子数组的最大值;
  6. 求以2结尾的连续子数组的最大值;
  7. 求以1结尾的连续子数组的最大值;
  8. 求以-5结尾的连续子数组的最大值;
  9. 求以4结尾的连续子数组的最大值;
    然后求以上子问题的最大值,即为所得结果;

我们这里再求子问题2:求以1结尾的连续子数据的最大值;
那对应的子数组只有2组,分别为[-2,1]和[1],很明显最大值数组为后者,那对应到公式应该为
Math.max(prev + num[i],num[i]),其中prev表示以-2结尾的连续子数组的最大值,num[i]对应当前下标值;
更加详细讲解可参考:LeetCode 经典动态规划问题

代码实现
   public int maxSubArray(int[] nums) {if(nums == null || nums.length == 0){return 0;}int prev = 0;int result = nums[0];for(int num:nums){prev = Math.max(prev + num,num);result = Math.max(prev,result);}return result;}

连续子数组的最大和(二)

题目

描述
输入一个长度为n的整型数组array,数组中的一个或连续多个整数组成一个子数组,找到一个具有最大和的连续子数组。
1.子数组是连续的,比如[1,3,5,7,9]的子数组有[1,3],[3,5,7]等等,但是[1,3,7]不是子数组
2.如果存在多个最大和的连续子数组,那么返回其中长度最长的,该题数据保证这个最长的只存在一个
3.该题定义的子数组的最小长度为1,不存在为空的子数组,即不存在[]是某个数组的子数组
4.返回的数组不计入空间复杂度计算

示例1
输入:
[1,-2,3,10,-4,7,2,-5]
返回值:
[3,10,-4,7,2]
说明:
经分析可知,输入数组的子数组[3,10,-4,7,2]可以求得最大和为18,故返回[3,10,-4,7,2]

示例2
输入:
[1]
返回值:
[1]

示例3
输入:
[1,2,-3,4,-1,1,-3,2]
返回值:
[1,2,-3,4,-1,1]
说明:
经分析可知,最大子数组的和为4,有[4],[4,-1,1],[1,2,-3,4],[1,2,-3,4,-1,1],故返回其中长度最长的[1,2,-3,4,-1,1]

思路

和上题整体思路一致,只不过需要在计算子问题的过程中,把子问题解对应的数组开始下标和结束下标记录下来;

代码实现
public int[] FindGreatestSumOfSubArray (int[] array) {if(array == null || array.length == 0){return new int[0];}int[] dp = new int[array.length];dp[0] = array[0];int max = dp[0];//start end表示所求数组开始与结束下标int start = 0;int end = 1;//当前一个子问题的最大值小于0时,需要重置开始位置,负责记录开始问题int temp = 0;for(int i = 1;i<array.length;i++){if(dp[i-1] <  0){dp[i] = array[i];temp = i;}else{dp[i] = dp[i-1]+array[i];}if(dp[i] >= max){max = dp[i];start = temp;end = i+1;}}return Arrays.copyOfRange(array,start,end);}

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

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

相关文章

【测试功能篇 01】Jmeter 压测接口最大并发量、吞吐量、TPS

压力测试&#xff0c;我们针对比较关键的接口&#xff0c;可以进行相应的压力测试&#xff0c;主要还是测试看看接口能抗住多少的请求数&#xff0c;TPS稳定在多少&#xff0c;也就是吞吐量多少 安装 Jmeter的安装很简单&#xff0c;官网下载地址 http://jmeter.apache.org/ &…

day30_servlet

今日内容 零、复习昨日 一、接收请求 二、处理响应 三、综合案例 零、复习昨日 画图, 请求处理的完整流程(javaweb开发流程) 零、注解改造 WebServlet注解,相当于是在web.xml中配置的servlet映射 Servlet类 package com.qf.servlet;import javax.servlet.ServletException; im…

HTML5学习系列之音频和视频

HTML5学习系列之音频和视频 前言音频和视频embedobjectaudiovideo 总结 前言 学习记录。 音频和视频 embed embed定义嵌入插件。 src&#xff1a;指定来源height&#xff1a;高度type&#xff1a;内容的类型width&#xff1a;内容的宽度 object 定义一个嵌入的对象 data…

HTML5学习系列之项目实战1

HTML5学习系列之项目实战1 前言代码记录问题总结 前言 学习记录 代码 <div id"player"><audio id"musicbox"></audio><div id"controls" class"clearfix controls"><div id"play" class"…

关于代码混淆,看这篇就够了

​ 代码混淆一.基本概念java的bytecode很容易通过JAD等反编译工具还原出源代码。这样势必不满足安全的定义。如何一定程度上保护需要防止被反编译的源代码呢&#xff1f;混淆&#xff08;obfuscate&#xff09;技术。注意&#xff1a;用obfuscate防盗版是根本不可能&#xff0c…

软考的含金量如何?怎么备考?

软考的含金量&#xff0c;太香了&#xff01; 一张软考证书可以抵扣个税&#xff0c;一次性抵扣3600元个税&#xff1b; 一张软考证书可以帮助省去大额的中介费&#xff0c;在一线城市直接职称入户&#xff1b; 一张软考证书可以在招投标中加分&#xff0c;为企业增加中标的…

代码随想录算法训练营第五十八天丨 单调栈01

739. 每日温度 思路 首先想到的当然是暴力解法&#xff0c;两层for循环&#xff0c;把至少需要等待的天数就搜出来了。时间复杂度是O(n^2) 那么接下来在来看看使用单调栈的解法。 什么时候用单调栈呢&#xff1f; 通常是一维数组&#xff0c;要寻找任一个元素的右边或者左边…

HTTP Header 参数详解

关于HTTP消息头 HTTP消息头是在&#xff0c;客户端请求&#xff08;Request&#xff09;或服务器响应&#xff08;Response&#xff09;时传递的&#xff0c;位请求或响应的第一行&#xff0c;HTTP消息体&#xff08;请求或响应的内容&#xff09;是其后传输。HTTP消息头&…

MySQL 的执行原理(二)

5.3. MySQL 的查询成本 5.3. MySQL 的查询成本 MySQL 执行一个查询可以有不同的执行方案&#xff0c;它会选择其中成本最低&#xff0c;或者 说代价最低的那种方案去真正的执行查询。不过我们之前对成本的描述是非常模 糊的&#xff0c;其实在 MySQL 中一条查询语句的执行成本…

golang学习笔记——fmt.Printf()、fmt.Print() 和 fmt.Println()区别

fmt.Printf()、fmt.Print() 和 fmt.Println()区别 fmt.Printf(), fmt.Print() 和 fmt.Println() 这三个函数都是 Go 语言标准库 fmt 中的函数&#xff0c;它们都可以用于在控制台输出文本。但是它们之间存在一些重要的区别&#xff1a; fmt.Printf()&#xff1a;这个函数的名…

Cmake学习

cmake大致 cmake_minimum_required(VERSION 3.0)project(test) #通过set自定义变量&#xff0c;通过${}取出 #set(SRC add.cpp main.cpp muti.cpp sub.cpp) #cmake搜索文件 宏定义PROJECT_SOURCE_DIR aux_source_directory(${PROJECT_SOURCE_DIR} SRC) #file(GLOB/GLOB_RECURSE…

静态文件鉴权

​ 静态文件鉴权的解决方案 背景介绍 XX业务系统作为BXX业务系统的孪生姐妹系统&#xff0c;是对BXX受理业务的强力补充系统&#xff0c;他允许操作员拿着IPAD&#xff0c;和客户约定地点上门受理业务。 因一些业务的受理&#xff0c;按照最新的业务规章制度&#xff0c;需…

常用 API 异常

常用 API & 异常 对之前那篇 API 文章的补充学习 1.API 1.1 API概述【理解】 什么是API ​ API (Application Programming Interface) &#xff1a;应用程序编程接口 java中的API ​ 指的就是 JDK 中提供的各种功能的 Java类&#xff0c;这些类将底层的实现封装了起来&am…

OpenCV快速入门:窗口交互

文章目录 前言一、鼠标操作1.1 鼠标操作简介1.2 鼠标事件类型&#xff08;event类型&#xff09;1.3 鼠标事件标志&#xff08;flags&#xff09;1.4 代码示例1.4.1 获取鼠标坐标位置1.4.2 监听鼠标滚轮事件1.4.3 在图像中显示鼠标坐标 二、键盘操作2.1 代码示例2.2 waitKey的等…

ssm家长乐山美食网站系统

1.需求分析\n将进行家乡乐山美食网站的需求分析。需求分析是系统开发过程中的一项重要工作&#xff0c;它是对用户需求进行深入研究和分析&#xff0c;明确系统的功能、性能、界面等方面的需求&#xff0c;为后续的设计和开发提供依据。\n首先&#xff0c;需要明确该网站的主要…

制作Go程序的Docker容器(以及容器和主机的网络问题)

今天突然遇到需要将 Go 程序制作成 Docker 的需求&#xff0c;所以进行了一些研究。方法很简单&#xff0c;但是官方文档和教程有些需要注意的地方&#xff0c;所以写本文进行记录。 源程序 首先介绍一下示例程序&#xff0c;示例程序是一个 HTTP 服务器&#xff0c;会显示si…

【GUI】-- 11 贪吃蛇小游戏之绘制静态的小蛇

GUI编程 04 贪吃蛇小游戏 4.2 第二步&#xff1a;绘制静态的小蛇 现在绘制静态的小蛇(即小蛇初始位置)&#xff0c;并且完善游戏默认初始状态。这一步还在GamePanel类中实现。 首先&#xff0c;定义了小蛇的数据结构&#xff0c; //定义蛇的数据结构int length; //小蛇总长…

JVM中的 -Xms参数 设置 JVM 的初始堆大小

在 Java 虚拟机&#xff08;JVM&#xff09;的配置中&#xff0c;-Xms 是一个启动参数&#xff0c;用于设置 JVM 的初始堆大小&#xff08;Initial Heap Size&#xff09;。这个参数对于优化 Java 应用程序的性能非常重要&#xff0c;特别是在处理需要大量内存的应用程序时。 …

azkaban二次开发

springboot封装azkaban的api&#xff0c;提供可调用azkaban任务流的接口 流程如下&#xff1a; springboot接口->azkaban api->azkaban project(flow tasks)->shell脚本->spark tasks Api测试 curl -k -X POST --data "actionlogin&usernameazkaban&am…

yolo系列模型训练数据集全流程制作方法(附数据增强代码)

yolo系列的模型在目标检测领域里面受众非常广&#xff0c;也十分流行&#xff0c;但是在使用yolo进行目标检测训练的时候&#xff0c;往往要将VOC格式的数据集转化为yolo专属的数据集&#xff0c;而yolo的训练数据集制作方法呢&#xff0c;最常见的也是有两种&#xff0c;下面我…