题目描述:
* 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
* 示例:输入: [-2,1,-3,4,-1,2,1,-5,4],
* 输出: 6
* 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6
解法一:
直接用暴力循环的方式,求出所有序列的和 然后取出最大值。这里就记录相关代码了。
解法二:
使用动态规划的方法,定义DP(i):以i节点为结束节点的最大值。动态转移方程:DP[i] = max(arr[i],DP[i-1]+arr[i])。当得到动态转移方程后,因为DP(0) =本身。然后可以推导出 DP(1)…DP(2)…DP(3)…DP(n) 。而我们想要的结果就是max(DP(1)…DP(2)…DP(3)…DP(n)) .代码如下:
因为我们只要每次比较相邻的DP(i)、DP(i-1)然后取出较大值 然后用较大者与 max相比较即可。可以省去 存储所有DP(i)的空间。
package leetcode;
import org.junit.Test;
/**
* @author liuzihao
* @create 2019/12/12-15:44
* 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
* 示例:输入: [-2,1,-3,4,-1,2,1,-5,4],
* 输出: 6
* 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6
*/
public class Demo53 {
// 定义DP[i]以 i节点为序列的最大值
//DP[i] = max(arr[i],DP[i-1]+arr[i])
//结果为 MAX(DP(i),DP(i-1),DP(i-2),DP(i-3)......DP(0))
@Test
public void test01(){
int [] arr = {-2,1,-3,4,-1,2,1,-5,4};
int max = Integer.MIN_VALUE;
int cur_max = 0;
for (int i = 0; i < arr.length; i++) {
cur_max = Math.max(cur_max+arr[i],arr[i]);
max = Math.max(cur_max,max);
}
System.out.println(max);
}
}
输出结果为6. 将这代码在力扣上提交也成功通过了。