求最小子数组01

  题目要求:一个整型数组,里面既有正数又有负数,要求一个时间复杂度为O(n)的算法来求出数组里面的最小子数组和的最大值。最小子数组指的是个数最少想连续的数组。

  设计思路:按照我自己的思路是利用循环的嵌套,挨个从数组中的每个元素出发,找出从该元素开始的最小子数组之和的最大值。但是这样算法的时间复杂度是O(n*n)。a老师提供的思路是动态划归的思路。这个思路挺好的,除了存放数字的数组array之外,再生成一个数组array1。array1数组中的第i+1个元素记录的是array前i个元素之和。如果array1[i+1]大于0,那么就把array1[i+1]和array[i+1]想加。否则array1[i+1]就是array[i+1]的值。每次都要更新maxVal的值。

 

package Arraysum;
import java.math.*;

public class findMaxArray {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] array = {1,2,3,-20,5,6,7};
        int max = Find.find(array);
        for(int i = 0;i < array.length;i++)
        {
            System.out.print(array[i]+" ");
        }
        System.out.println();
        System.out.println("最大子数组之和为:"+max);
    }
}

class Find
{
    public static int find(int[] array)
    {
        int array1[] = new int[array.length];
//        for(int i = 1;i < array1.length;i++)
//        {
//            array1[i] = 0;
//        }
        array1[0] = array[0];
        int maxVal = array[0];
        for(int i = 0;i < array.length - 1;i++)
        {
            //如果第i+1个元素的前i个元素之和大于0就把这i个元素的和加到第i+1个元素上面        即前i个元素对第i+1个元素有贡献
            if(array1[i] > 0)
            {
                array1[i+1] = array1[i] + array[i+1];
            }
            //如果第i+1个元素的前i个元素之和小于0不加        即前i个元素对第i+1个元素没有贡献
            else
            {
                array1[i+1] = array[i+1];
            }
            //更新最大值 
            maxVal = Math.max(maxVal,array1[i+1]);
        }
        return maxVal;
    }
}

posted @ 2016-04-06 15:00  学计算机的人绝不认输  阅读(575)  评论(0编辑  收藏  举报