美文网首页
最大子序列问题

最大子序列问题

作者: 薛东弗斯 | 来源:发表于2018-04-22 18:59 被阅读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)

    相关文章

      网友评论

          本文标题:最大子序列问题

          本文链接:https://www.haomeiwen.com/subject/bzbclftx.html