最大子段和问题

题意:一串数组,正负数都有,找出和最大的子数组。
思路:三种解法。简单解法,分治解法,动规解法。
代码:
简单解法:

//简单实现方法
public class MaxSubString {
    public int MaxSum(int []arr){
        int besti = 0, bestj = 0;
        int sum = 0;
        for(int i = 0 ; i <arr.length ; i++){
            int suma = 0;
            for(int j = i ; j <arr.length ; j++){
                suma +=arr[j];
                if(suma > sum){
                    sum = suma;
                    besti = i;
                    bestj = j;
                    }
                }
            }
        return sum;
        }

分治解法:先找出center,左右找(left,center)和(center+1,right)的最大值leftSum和rightSum;再找横跨center的最大值sum,最后比较leftSum、rightSum、sum三个值的大小,返回最大值。

//分治法实现
    public int MaxSum2(int []arr , int left , int right){
        int sum = 0;
        if(arr == null || arr.length == 0) {
            return -1;
        }   
        if(left == right){
            if(arr[left] > 0) sum = arr[left];
            else sum = 0;
        }else{
        int center = (left+right) /2;   
        int leftsum = MaxSum2(arr , left , center);
        int rightsum = MaxSum2(arr, center+1, right);

        int lefts = 0 , s1 = 0;
        for(int i = center ; i >= left ; i-- ){
            lefts += arr[i];
            if(lefts > s1){
                s1 = lefts;
            }
        }
        int rights = 0 , s2 = 0;
        for(int j = center + 1 ; j <= right ; j++){
            rights +=arr[j];
            if(rights > s2){
                s2 = rights;
            }
        }
        sum = s1+ s2;
        if(Math.max(leftsum, rightsum) > sum) sum = Math.max(leftsum, rightsum);
        }
        return sum;
    }

动规解法:

public int MaxSum3(int []arr){
        int sum = 0 , b = 0 ;
        for(int  i = 1 ; i <= arr.length ; i++){
            if(b > 0){
                b +=arr[i-1];
            }else{
                b = arr[i-1];
            }
            if(b > sum){
                sum = b;
            }
        }
        return sum;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值