算法:动态规划,最大子数组之和 Maximum Subarray
题目
53. Maximum Subarray
Given an integer array nums, find the contiguous subarray (containing at least one number) which has the largest sum and return its sum.
Example:
Input: [-2,1,-3,4,-1,2,1,-5,4],
Output: 6
Explanation: [4,-1,2,1] has the largest sum = 6.
Follow up:
If you have figured out the O(n) solution, try coding another solution using the divide and conquer approach, which is more subtle.
解决
解决思路:这是动态规划的题目,突破口是要找到一个公式,使得dp[i] = x * dp[i-1] + y, 这样子就可以根据上一个数推断出下一个结果,达到O(n)解。
这里的突破口是当前数nums[i], 是从自己开始,还是与前面的数dp[i-1] 加起来一起。这里就要判断dp[i - 1] > 0 ? dp[i - 1] : 0, 上一个数的和是否大于0.
那么问题就迎刃而解了。
- 如果dp[i - 1] < 0, 就从自己开始 dp[i] = nums[i];
- 如果dp[i - 1] > 0, 就延续前任的记过 dp[i] = nums[i] + dp[i - 1];
- 如果最大数是历史最大,则替换max = Math.max(max, dp[i]);, 最终结果为max。
class Solution {public int maxSubArray(int[] nums) {// check edgeif (nums == null || nums.length == 0) {throw new IllegalArgumentException();}int length = nums.length;int dp[] = new int[length];dp[0] = nums[0];int max = dp[0];for (int i = 1; i < length; i++) {dp[i] = nums[i] + (dp[i - 1] > 0 ? dp[i - 1] : 0);max = Math.max(max, dp[i]);}return max;}
}
算法:动态规划,最大子数组之和 Maximum Subarray相关推荐
- leetcode算法题--K 次串联后最大子数组之和★
原题链接:https://leetcode-cn.com/problems/k-concatenation-maximum-sum/ 如图(来源) 记k==1,数组和为sum 分情况讨论: 当k == ...
- 求一个二维整数数组最大子数组之和,时间复杂度为N^2
本随笔只由于时间原因,我就只写写思想了 二维数组最大子数组之和,可以 引用 一维最大子数组之和 的思想 一维最大子数组之和 的思想,在本博客上有,这里就不做多的介绍了 我们有一个最初的二维数组 ...
- 环形数组求最大子数组之和
环形数组求最大子数组之和: 实验要求: 随机产生一个整形数组,假设首尾相连为环形,求其相连的字数组的和,并输出子数组的元素. 设计思路: 因为是环形,所以要考虑自设的头尾的情况,在此分为两大类考虑,一 ...
- 环形数组最大子数组之和
题目:返回一个整数数组中最大子数组的和. 要求: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 如果数组A[0]--A[j-1]首尾相邻, ...
- LeetCode 1191. K 次串联后最大子数组之和(前缀和+分类讨论)
文章目录 1. 题目 2. 解题 1. 题目 给你一个整数数组 arr 和一个整数 k. 首先,我们要对该数组进行修改,即把原数组 arr 重复 k 次. 举个例子,如果 arr = [1, 2] 且 ...
- 最大子数组下标java,【算法】最大子数组
问题描述:给定一只股票在某段时间内的历史价格变化曲线,找出一个能够实现收益最大化的时间段. 理解:为找出最大化的收益,需要考虑的是在买进和卖出时的价格变化幅度,因此从该股票的每日变化幅度来考虑问题比较 ...
- leetcode - 1191. K 次串联后最大子数组之和
给你一个整数数组 arr 和一个整数 k. 首先,我们要对该数组进行修改,即把原数组 arr 重复 k 次. 举个例子,如果 arr = [1, 2] 且 k = 3,那么修改后的数组就是 [1, 2 ...
- 动态规划——最大子数组和(Leetcode 53)
题目选自Leetcode 53. 最大子数组和 题目描述: 解题思路: 解题代码: int maxSubArray(int* nums, int numsSize){int pre = 0, maxA ...
- 算法-----------乘积最大子数组(Java版本)
题目: 给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积.示例 1:输入: [2,3,-2,4] 输出: 6 解释: 子数组 ...
- 1191. K 次串联后最大子数组之和(最大子段和变形)
给你一个整数数组 arr 和一个整数 k. 首先,我们要对该数组进行修改,即把原数组 arr 重复 k 次. 举个例子,如果 arr = [1, 2] 且 k = 3,那么修改后的数组就是 [1, 2 ...
最新文章
- 一文搞懂select语句在MySQL中的执行流程!
- window下git的使用
- 前端之同源策略 Jsonp 与 CORS
- [leetcode] @python 113. Path Sum II
- Kafka副本同步机制理解
- Linux线程编程之生产者消费者问题【转】
- 最容易扩展的光立方程序设计
- 【Linux】动态防火墙,实现对攻击IP的动态拦截,一定程度上解决云服务器主机经常被境外IP尝试登录,屏蔽指定地区、国家的IP连接
- Linux使用cp命令报cp:omitting directory错误
- Python(17)python使用tkinter实现一个简单的CSGO幸运转盘抽奖游戏
- 【防火墙篇】01. 映射 Web 服务器 ❀ WatchGuard 防火墙
- Python 基础知识教程
- 【视觉SLAM入门】一些关于视觉SLAM十四讲的重要基础概念
- scDeepCluster:Clustering single-cell RNA-seq data with a model-based deep learning approach论文解读
- 以马原的视角浅谈IP地址的发展——IPv4、IPv6、NAT
- 全功能mp3,wav音频格式转换器-QVE音频剪辑
- 使用cubemx工具的STM32对外部flash(W25Q64)的简单编程
- Axure Axhub Charts 数据编辑、显示
- 对ansys主要命令的解释
- 本地项目链接svn服务器,eclipse链接本地svn服务器
热门文章
- 常平计算机培训班,常平大朗CNC编程培训速成班,一个月学会UG编程
- python基于udp的网络聊天室再用tkinter显示_Python3:Tkinter gui中的UDP包发送/接收
- deque python_python3 deque(双向队列)的详细介绍
- eclipse代码量统计插件_推荐一波代码量、行数、提交量、作者等全维度统计神器...
- MyBatis数据输出
- 修改mysql数据存放路径
- Linux运维(三)
- Event Listener's Adapter Classes
- 华为手机连不上adb解决方法
- Linux 三个强大的系统资源监控工具