子数组最大和JAVA动态规划_关于 Java 中的动态规划(Leetcode.53 最大子序和)

Given an integer array nums, find the contiguous subarray (containing at least one number) which has the largest sum and return its sum.(Leetcode 53. Maximum Subarray)

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

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

这是Leetcode上数组部分关于动态规划的一个简单的题目,动态规划只是他的一个基础解法,在这里记录关于动态规划的一些思路和想法。

什么是动态规划?

关于动态规划,维基百科是这样说的(看不懂):动态规划(英语:Dynamic programming,简称DP)是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。 动态规划常常适用于有重叠子问题和最优子结构性质的问题,动态规划方法所耗时间往往远少于朴素解法。

简单来说,就是大事化小,小事化了。也就是按照一定的规则方法,找到其中的一般规律,通过这种方法,减少计算量和时间复杂度。

怎么找规律?

对于动态规划类型的问题,找规律就是跟找递归规律是一个味道,总结来说,就是有和无的操作。

此话此话怎讲?以本题来说:我们从数组的最后一位来看 opt[8] (也就是最后一位),他的最大和可以是两种情况,一种是前一个数(包含前一个数在内的)的最大和,或者是自己本身。

3452cd9d5664

Leetcode.53 最大子序和

在做分析的时候,从后往前看,出现结果最大的情况包含两种,一种是自己本身,另外一种是前一个数字的最大和加上自己本身。将其抽象化可以获得其的一般规律:

3452cd9d5664

动态规划的相关问题

通过分析,解决的方法就被我们分析出来了,但观察上式,很容易会认为这个是一个递归的解法,其实,没得任何毛病,但认真想想,递归的执行其实跟我们分析的顺序是一样的,他在执行中会存在重复计算的问题:

斐波那契数列就是一个很直观的栗子在数学上,费波那契数列是以递归的方法来定义:

math?formula=%7B%5Cdisplaystyle%20f(n)%3D%7B%5Cbegin%7Bcases%7D0%26%5Cquad%20n%20%3D%20%7B%5Ctext%7B0%7D%7D%5C%5C1%26%5Cquad%20n%20%3D%20%7B%5Ctext%7B1%7D%7D%5C%5Cf(%7B%5Ctext%7Bn-1%7D%7D)%2Bf(%7B%5Ctext%7Bn-2%7D%7D)%26%5Cquad%20n%E2%89%A72%5Cend%7Bcases%7D%7D%7D

当我们需要计算

math?formula=f(8)的时候,就需要计算

math?formula=f(7)%E5%92%8Cf(6)%20%E8%80%8C%20f(7)%20%E5%8F%88%E7%AD%89%E4%BA%8Ef(6)%2Bf(5)%2Cf(6)在这个地方就被重复计算了。

当我们计算某一个位的数字的值的时候,出现重复计算,将会导致最终的复杂都成几何倍增长。

Java 代码的实现

3452cd9d5664

Java的一种实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值