剑指offer42-连续子数组的最大和(动态规划)

剑指offer42-连续子数组的最大和(动态规划)

1 题目描述

输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
要求时间复杂度为O(n)。
示例:

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

2 解题思路

因为涉及到动态路径以及最优解的问题,因此首先想到使用动态规划来解答。那么本题的关键点就在于正确写出转移方程如下:
在这里插入图片描述
步骤:

  • 建立一个和数字长度一致的dp表。
  • 计算出数组中每个元素对应的dp值(当前元素结尾的子串的最大和)。
  • 找出dp表中的最大值,即为本题所求的值。

3 代码实现

class Solution {
    
    
    public static void main(String[] args){
    
    
        System.out.println("请输入一个整数型数组,以空格隔开:");
        Scanner sc = new Scanner(System.in);
        //定义字符串数组
        String[] nums = null;
        //切分字符串,并将切分后的字符串保存在字符串数组中
        nums = sc.nextLine().split(" ");
        int[] num = new int[nums.length];
        for(int i = 0; i < num.length; i++){
    
    
            //String转Integer基本类型
            num[i] = Integer.valueOf(nums[i]);
        }
        System.out.println(maxsubArray(num));
    }
    public int maxSubArray(int[] nums) {
    
    
    	//定义dp表,长度和数组相等
        int[] dp = new int[nums.length];
        dp[0]=nums[0];
        //计算dp表
        for(int j = 1;j<nums.length;j++){
    
    
            if(dp[j-1]>0){
    
    
                dp[j] = dp[j-1]+nums[j];//转移方程
            }else{
    
    
                dp[j] = nums[j];//转移方程
            }
        }
        //求最大值
        int max = Integer.MIN_VALUE;
        for(int i = 0;i<dp.length;i++){
    
    
            if(dp[i]>max)
                max = dp[i];
        }
        return max;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_41797782/article/details/115368329