剑指Offer: (Java实现) 连续子数组的最大和

来源:互联网 发布:苹果手机 解压软件 编辑:程序博客网 时间:2024/05/23 20:17

* 类说明:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为 O(n)。例如输入的数组为{1,-2,3,10,-4,7,2,-5},和最大的子数组为{3,10,-4,7,2}。*


* 非递归实现,打印出最大和的连续子数组的子序列; curSum表示算上当前元素的最大值,curMax表示截止到当前元素的最大值 *

public class FindMaxSerialArray01 {    public static void main(String[] args) {        int[] arr = {1,-2,3,10,-4,7,2,5};        int length = arr.length;        int curSum = 0;        int curMax = 0;         int start = 0,end = 0;        for(int i = 0;i< length;i++){            if( curSum <= 0){                curSum = arr[i];                start = i;            }else{                curSum+= arr[i];                end = i;            }            if(curSum > curMax){                curMax = curSum;            }else{                end--;            }        }        System.out.print("子数组和为:"+curMax+"\n子数组为:");        for( int i= start;i<=end;i++){            System.out.print(arr[i]+" ");        }    }}

* 动态规划, 递归实现 . 求出length个函数的值,然后依次比较得出最大值。当i=0 or F(i-1)<=0时候:F(arr,i)= arr[i];否则F(arr,i)=arr[i]+F(arr,i-1)*

public class FindMaxSerialArray02 {    public static void main(String[] args) {        int[] arr = {1,-2,3,10,-4,7,2,-5};        int length = arr.length;        int result = F(arr,0);        for(int i=0;i<length;i++){            int a = F(arr,i);            if(a >=result){                result = a;            }        }        System.out.println(result);    }    public static int F(int[] arr,int i){        if(i==0){            return arr[0];        }else{            if(F(arr,i-1)<=0){                return arr[i];            }else{                return arr[i]+F(arr,i-1);            }        }    }}