码迷,mamicode.com
首页 > 其他好文 > 详细

剑指offer——2

时间:2016-05-10 18:43:16      阅读:132      评论:0      收藏:0      [点我收藏+]

标签:

28. 连续子数组的最大和

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

例如输入的数组为{1, -2, 3, 10, -4, 7, 2, -5},和最大的子数组为{3, 10, -4, 7, 2}。因此输出为该子数组的和 18 。

解法一:举例分析数组的规律

技术分享

public class Test{
    public static int findGreatestSum(int [] arr){
        if(arr==null || arr.length <1){
            throw new IllegalAccessException("Array must contains an element");
        }
        
        int max=Integer.MIN_VALUE;
        
        //当前和
        int curMax=0;
        
        for(int i: arr){
            //curMax<=0 加上后面的数只会让和 更加小
            if(curMax<=0){
                curMax=i;
            }else{
                curMax+=i;
            }
            
            if(max<curMax){
                max=curMax;
            }
        }
        return max;
    }
    
    public static void main(String[] args){
        int[] data = {1, -2, 3, 10, -4, 7, 2, -5};
        int[] data2 = {-2, -8, -1, -5, -9};
        int[] data3 = {2, 8, 1, 5, 9};
        System.out.println(findGreatestSumOfSubArray(data));
        System.out.println(findGreatestSumOfSubArray(data2));
        System.out.println(findGreatestSumOfSubArray(data3));
    }
}

 

 

解法二: 应用动态归划法

可以用动态规划的思想来分析这个问题。如果用函数 f(i)表示以第 i 个数字结尾的子数组的最大和,那么我们需要求出 max[f(i)],其中 0 <= i < n。我们可用如下边归公式求 f(i):

技术分享

这个公式的意义:当以第 i-1 个数字结尾的子数组中所有数字的和小于 0 时,如果把这个负数与第 i 个数累加,得到的结果比第 i 个数字本身还要小,所以这种情况下以第 i 个数字结尾的子数组就是第 i 个数字本身。如果以第 i-1 个数字结尾的子数组中所有数字的和大于 0,与第 i 个数字累加就得到以第 i 个数字结尾的子数组中所有数字的和。

 

 

29. 从1到n整数中1出现的次数

 

30. 

 

剑指offer——2

标签:

原文地址:http://www.cnblogs.com/zxqstrong/p/5478568.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!