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

题目一:

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

思路:
创建一个新数组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;
    }
}

学习文章

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值