动态规划从零开始(1)-剑指Offer 42
简单的动态规划说明:
题目说明:输入一个整型数组 , 数组中的一个或连续多个整数组成一个子数组 。 求所有子数组的和的最大值 。
要求时间复杂度为O(n) 。
示例1:
输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大 , 为 6 。
来源:力扣(LeetCode)
链接:
著作权归领扣网络所有 。 商业转载请联系官方授权 , 非商业转载请注明出处 。
假设我们设f(n)为到第n个数组元素时 , 可能存在的子数组的最大值 。 nums为提供的原数组 。
我们通过动态规划的方程可以简单罗列出方程的思路:
【动态规划从零开始(1)-剑指Offer 42】f(n) = max{f(n-1)+nums(n),nums(n)};
简而言之 , 要么是第[n]元素和之前的值加在一起是最大的 , 要么[n]元素本身的大小就超过了f(n-1)+nums[n] 。
所以我们需要一个对象dp[n]来记录【当前路径的最大值】 , 一个对象max来存储【已经走完的路径的最大值】 。 为什么还要max呢?因为走完整个数组后 , 最大的一段数组可能是在前面、中间或后面 , dp完成后的值未必是最大值 。
如[9,-1,-2,-3] , dp[3]=3 , 但max=9 。 所以dp[n]的目的是遍历整个数组 , 同时利用max进行记录 。
代码:Java
执行用时:1 ms, 在所有 Java 提交中击败了99.42%的用户
class Solution {public int maxSubArray(int[] nums) {int[] dp = new int[nums.length];dp[0] = nums[0];int max = dp[0];for (int i =1;i
f(n)={selector}(f(n-1),n) , 其中{selector}指Math.max,Math.min等数学选择方法 。
- 华为连续三大动作,开始全面自救,比尔盖茨:中国芯破冰指日可待
- AMDCES发布会1月13日凌晨0点开始:苏姿丰作主题演讲
- 马云又说对了,二维码或将被淘汰,全新支付方式开始兴起
- 2021年脱单攻略,从选购一把剃须刀开始
- 灯塔市税务局首个5G智慧办税厅开始试运行
- 官宣!11款vivo系机型开始公测最新系统OriginOS
- 中国移动又开始了一次奇怪尝试
- 在Galaxy Buds Pro正式发布前 有人已开始在Facebook上出售这款产品
- 喵博士资讯 | 西安奥体中心建成国内首个5G场馆;苹果被曝已开始在工厂测试折叠屏iPhone
- Linux 5.11开始围绕PCI Express 6.0进行早期准备