4.最大子数组问题

最大子序和(LeetCode 53题 难度:简单)

dp数组定义

		dp[i]就是以nums[i]结尾的"最大子数组的和"
		dp[i]有两种选择:
				要么与前面相邻的子数组连接,形成一个更大的子序和的数组
				要么不与前面连接,自成一派,自己作为一个子数组

要么 自成一派,要么与前面的子数组合 并形成更大的数组

	dp[i]=Math.max(nums[i],dp[i-1]+nums[i]);

综上 已经得到了状态转移方程

完整代码:

public int maxSubArray(int[] nums) {  
   int n=nums.length;  
   if(n==0){  
       return 0;  
   }  
   int dp[]=new int[nums.length];  
   //base base  
 	dp[0]=nums[0];  
 	int res=Integer.MIN_VALUE;  
    for (int i = 1; i < n ; i++) {  
		//状态转移方程  
		//要么 自成一派,要么与前面的子数组合 并形成更大的数组
        dp[i]=Math.max(nums[i],dp[i-1]+nums[i]);  
  
    }  
    for (int i = 0; i < dp.length; i++) {  
        res= Math.max(res,dp[i]);  
    }  
  
    return res;  
}

以上解法的时间复杂度O(N),空间O(N),比暴力破解快多了

不过不难发现dp[i]的状态只与dp[i-1]有关,可以进行状态压缩

计算dp[i]的同时计算res

posted @ 2021-07-05 23:13  宋佳强  阅读(46)  评论(0编辑  收藏  举报