#剑指offer(17)--连续子数组的最大和

来源:互联网 发布:arm linux 开机启动 编辑:程序博客网 时间:2024/05/17 03:30

输入:连续输入一个整型数组,数组里有正数也有负数,数组中一个或连续的多个整数组成一个子数组,求所有子数组的和的最大值,要求时间复杂度为O(n)。
利用动态规划:
1.新建数组re(与输入数组arr一样大)
2.re[i]表示以第i个数字结尾的子数组的最大和,然后在数组re中求出最大值
3.初始状态下re[0] = arr[0]
4.a.如果re[i-1]<0,则re[i] = arr[i]
b.否则re[i] = re[i-1]+arr[i]

java实现:

public class 连续子数组的最大和 {    public static void main(String[] args) {        // TODO Auto-generated method stub        int[] arr = new int[]{-1,2,3,10,-4,7,-2,-5};        f1(arr);        f2(arr);    }    ///方法1  找规律    static void f1(int[] arr){        int max = arr[0] ;        int lastValue = arr[0];        for(int i = 1;i <arr.length;i++){            max = Math.max(max, lastValue);            if(lastValue< 0){                lastValue = 0;            }                       lastValue = lastValue+arr[i];        }        max = Math.max(max, lastValue);        System.out.println(max);    }    //动态规划    static void f2(int[] arr){        int[] re = new int[arr.length];        re[0] = arr[0];        for(int i = 1 ; i<arr.length;i++){            if(re[i-1]<0){                re[i] = arr[i];            }else {                re[i] = re[i-1] + arr[i];            }        }        int max = re[0];        for(int i = 0;i<re.length;i++){            max = Math.max(max, re[i]);        }        System.out.println(max);    }}
原创粉丝点击