最大子序列问题

2018-04-22  本文已影响0人  薛东弗斯

最大子序列问题

给定一个数列,其中的数有正有负,求这个数列中的某一个子序列使得它们的和最大。

例如:

-2, 11, -4, 13, -5, 2, -5, -3, 12, -9 这个数列中,子序列和最大为21

-2 ,11, -4, 13, -5, -2 和为20 思路:

traverse整个数组

用sum存储当前位置及其之前的数字之和

因为每次循环都会求得一个sum,用max存储最大的sum

如果某一次求得的sum<0,则另sum=0,意思是抛弃之前所有的元素,从之后的元素重新开始求和。

public class Maxsubarray {

    public int maxsum(int[] array){

        if(array.length == 0) return 0;

        else if(array.length == 1) return array[0];

        else{

            int sum = 0;

            int max = sum;

            for(int i = 0; i < array.length; i++){

                if(max < sum) max = sum;

                sum = sum + array[i];

                if(sum < 0)

                    sum = 0;

            }

            return max;

        }

    }

    public static void main(String[] args) {

        int array[] = {-2 ,11, -4, 13, -5, -2};

        Maxsubarray ms = new Maxsubarray();

        System.out.println(ms.maxsum(array));

    }

}

时间复杂度由n规模的for循环贡献,因此是O(n)

上一篇下一篇

猜你喜欢

热点阅读