LeetCode 53. 最大子数组和【贪心算法、动态规划】
53. 最大子数组和
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。
输入: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
提示:
1 <= nums.length <= 10^5
-10^4 <= nums[i] <= 10^4
进阶: 如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的 分治法 求解。
- 暴力解法:超时 O ( n 2 ) O(n^2) O(n2)
class Solution {// 暴力解法:超时 O(n^2)public int maxSubArray(int[] nums) {int res = Integer.MIN_VALUE;for (int i = 0; i < nums.length; i++) { // 设置起始位置int cnt = 0;for (int j = i; j < nums.length; j++) { // 每次从起始位置i开始遍历寻找最大值cnt += nums[j];res = Math.max(cnt, res);}}return res;}
}
- 贪心: O ( n ) O(n) O(n)
- 局部最优:当前“连续和”为负数的时候立刻放弃,从下一个元素重新计算“连续和”,因为负数加上下一个元素 “连续和”只会越来越小。
- 全局最优:选取最大“连续和”
class Solution {// 贪心:O(n)// 局部最优:当前“连续和”为负数的时候立刻放弃,从下一个元素重新计算“连续和”,因为负数加上下一个元素 “连续和”只会越来越小。// 全局最优:选取最大“连续和”public int maxSubArray(int[] nums) {int cnt = 0, res = Integer.MIN_VALUE;for (int x : nums) {cnt += x;if (cnt > res) res = cnt; // 取区间累计的最大值(相当于不断确定最大子序终止位置)if (cnt < 0) cnt = 0; // 相当于重置最大子序起始位置,因为遇到负数一定是拉低总和}return res;}
}
- 动态规划 O ( n ) O(n) O(n)
class Solution {// 动态规划 O(n)public int maxSubArray(int[] nums) {int[] f = new int[nums.length]; // f[i]表示包括i之前的最大连续子序列和f[0] = nums[0];int res = f[0];for (int i = 1; i < nums.length; i++) {f[i] = Math.max(f[i - 1] + nums[i], nums[i]);if (f[i] > res) res = f[i]; // res保存f[i]的最大值}return res;}
}
LeetCode 53. 最大子数组和【贪心算法、动态规划】相关推荐
- 156. Leetcode 53. 最大子数组和 (贪心算法-进阶题目)
class Solution:def maxSubArray(self, nums: List[int]) -> int:result = -float('inf')count = 0for i ...
- 求最大子数组(贪心算法)
在<算法导论>中举了买股票和割铁棒的例子来说明动态规划和贪心算法的主体思想. 贪心算法:总是做出在当前看来最好的情况.(不是整体最优的) 1. 问题及答案 先抛出一个问题,类似于<算 ...
- 114. Leetcode 53. 最大子数组和 (动态规划-子序列问题)
步骤一.确定状态: 确定dp数组及下标含义 dp[i]:包括下标i之前的最大连续子序列和为dp[i]. 步骤二.推断状态方程: dp[i]只有两个方向可以推出来: dp[i - 1] + nums[i ...
- 力扣贪心算法专题(一)455.分发饼干 376. 摆动序列 53. 最大子序和 122.买卖股票的最佳时机II 1005.K次取反后最大化的数组和 思路及C++实现 贪心算法 动态规划
文章目录 贪心算法 455.分发饼干 思路 步骤 代码 376. 摆动序列 贪心算法 思路 分析 代码 动态规划 思路 步骤 代码 53. 最大子序和 暴力解法 双层for循环 贪心算法 思路 分析 ...
- leetcode 53. 最大子序和 动态规划解法、贪心法以及二分法
题目 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释: 连续子 ...
- 53. 最大子数组和 392.判断子序列 115.不同的子序列
53. 最大子数组和 dp[i]: 0-i-1,包含下标i-1的最大和为dp[i] 若dp[i-1]小于0,则和重新从nums[i]开始计算. 最后返回dp[i]最大值即可 392.判断子序列 i为短 ...
- leetcode - 53. 最大子序和 152. 乘积最大子序列 - 两个算法之间的联系和区别
这两道算法题的解题思路是差不多的,但是从整体上分析,乘积最大子序列之和是最大子序和的进阶.先来看看两道算法题的简单描述. 53.最大子序和 给定一个整数数组 nums ,找到一个具有最大和的连续子数组 ...
- 53. 最大子序和 golang (动态规划与贪心算法)
题目 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续 ...
- leetcode系列-53.最大子数组和
题目描述: 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素), 返回其最大和.子数组 是数组中的一个连续部分. 示例 1: 输入:nums = [-2,1,- ...
最新文章
- 网站常规基本优化工作有哪些?
- lstm处理时序数据结构图_详解LSTM
- 腾讯:互联网正进入社区化阶段
- 让 windows 的桌面 干净。。。再干净点。。。
- 5渲染判断if_React 16 渲染流程
- 接口、抽象类、类之间的关系
- CentOS录屏快捷键
- codejock(codejock chart类)
- 小马激活软件下载,当心伪小马,有病毒
- wsdl文件怎么看服务器地址,wsdl文件 服务器地址
- my ReadBook_liutongjingjixue / circulation economics
- Design Patterns of SourceMaking
- linux图片裁剪工具,linux中如何使用终端裁剪图片?
- clientX、offsetX、screenX、pageX的区别
- 2021年茶艺师(中级)考试报名及茶艺师(中级)免费试题
- Android Launcher启动流程
- 网关 Spring Cloud Zuul 自定义过滤器认证转换 Token
- jdk1.8的安装教程
- Linux下利用nc命令来监控检测服务器的端口使用情况
- Python 随堂练习