连续子数组的最大和以及变形

题目一:

输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值

思路:
创建一个新数组B用于存放数组i之前的最大子数组的和,从前往后遍历原数组A,计算数组A当前i元素的值+B数组的i-1元素的值的和 与数组A当前元素的值比较大小,选择大的存放在数组B中。最后数组B中最大的元素就是连续子数组的最大和

题目二

输入一个整数数组,任意连续的两个或多个整数为一个子数组,求子数组的最大和。

思路:

这道题和上道题的不同在于这道题规定了子数组的最小长度为2。我们可以先创建一个数组长为2,去算每一个长度为2的子数组的和,取最大值,原数组遍历结束后,再将子数组的长度设为3,重复上面操作,直到子数组的长度为原数组长度,从上述其中记录和最大值就可

代码:

package dp;

import java.util.Arrays;

public class MaxSum {

    public static void main(String[] args) {
        int[] arr=new int[]{-1,-1,10,-9};
        int res=find1(arr);
        System.out.println(res);//10

        int r=find2(arr);
        System.out.println(r);//9

    }



    /*
    输入一个整形数组,数组里有正数也有负数。
    数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
    求所有子数组的和的最大值
* */
    private static int find1(int[] arr) {
        int[] dp=new int[arr.length];
        dp[0]=arr[0];
        int max=dp[0];
        for (int i = 1; i <arr.length ; i++) {
            dp[i]=Math.max(dp[i-1]+arr[i],arr[i]);
            max=Math.max(max,dp[i]);
        }

        return max;
    }

/*输入一个整数数组,任意连续的两个或多个整数为一个子数组,求子数组的最大和。*/
    private static int find2(int[] arr) {
        int maxsum=0;
        int n=arr.length;
        int sum=0;
        for(int a=2;a<=n;a++){//用来控制数组的整体大小
            //创建一个子数组,子数组的长度从2,依次递增到n
            int[] zi=new int[a];

            for(int b=n-a+1 ;b>0; b--){//用来配合移动arr下标

                for (int i = 0; i <a ; i++) {//给子数组赋值
                    zi[i]=arr[i+n-a+1-b];
                    sum+=zi[i];//算子数组的和
                }
                if (sum>maxsum){
                    maxsum=sum;
                }
                sum=0;//将sum置为0,用于下一轮计算

            }


        }
        return maxsum;
    }
}

学习文章

你可能感兴趣的:(算法,算法)