面试题31: 连续子数组的最大和

来源:互联网 发布:光环大数据怎么样 编辑:程序博客网 时间:2024/05/16 15:45

一. 题目

输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整数组成一个子数组.求所有子数组的和的最大值.要求时间复杂度为O(n).

代码请到我的代码库中下载 Point2Offer

二. 代码

package week_3;/**难度系数:*** * 剑指offer: 连续子数组的最大和 * 方法:利用当前累加子数组和最大值or动态规划(未实践) * 测试用例:功能测试(全正数组,全负,有正有负,为空) * @author dingding * Date:2017-6-28 10:45 * Declaration: All Rights Reserved! */public class No31 {    private static boolean isvalid = true;  //是否有效    public static void main(String[] args) {        test1();        test2();        test3();        test4();    }    private static int findMaxSumOfSubArray(int[] data,int length){        if (data == null || length<1) {            isvalid = false;            return 0;        }        isvalid = true;  //以便下一次调用        int addToNSum = 0;        int nMaxSum = 0x80000000; //最小数        for (int i=0;i<length;i++){            if (addToNSum<=0) {    //这一步很巧妙                addToNSum = data[i];            }else{                addToNSum +=data[i];            }            if (addToNSum > nMaxSum) {                nMaxSum = addToNSum;            }        }        return nMaxSum;    }    /*====================测试用例=================*/    private static void test(int[] data,int length){        int result = findMaxSumOfSubArray(data, length);        if (!isvalid && result == 0) {            System.out.println("invalid input.");        }else {            System.out.println("连续最大子数组和为: "+result);        }    }    private static void test1() {        int[] data = {1,-2,3,10,-4,7,2,-5};        test(data, data.length);    }    private static void test2() {        int[] data = {1,2,3,4,5};        test(data, data.length);            }    private static void test3() {        int[] data = {-1,-4,-3,-5};        test(data, data.length);            }    private static void test4() {        int[] data = {};        test(data, data.length);            }}

有不妥当之处,麻烦告知:D

原创粉丝点击