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

Lintcode - Maximum Subarray III

时间:2015-11-19 07:01:51      阅读:355      评论:0      收藏:0      [点我收藏+]

标签:

Given an array of integers and a number k, find k non-overlappingsubarrays which have the largest sum.

The number in each subarray should be contiguous.

Return the largest sum.

http://www.lintcode.com/en/problem/maximum-subarray-iii/

 

Thought:

一开始以为这和best time to buy and sell stock III 一样的解法,但是test case只过了82%.后来发现问题出在这个必须为K个,而不是at most k.

比如 input 是 [1,-1,-2],k=2. 如果是at most k,那么最后的答案会是1,可是必须是k的话,答案则是0.所以此题并不是每一个数都会走k次,K的最大取值是min(k,i+1),如此我们就能保证在k步时,肯定是包括exactly k个subarray.

此题依然用两个数组维系. 一个是local,一个global. k的更新也依然是从后往前.

dp公式是   local[j] =Math.max(global[i-1],local[j])+nums[i];

               global[j]=Math.max(global[j],local[j]); 

local维系的是Max(前i-1个数中k-1个subarray最大的sum,i-1个数中k个subarray最大sum,且最后一个subarray一定包括nums[i-1])+当前的数.

时间开销是KN,空间开销是O(K).

  public static int maxSubArray(List<Integer> nums, int k) {
        // write your code
        if(nums==null||nums.size()<k){
            return 0;
        }
        int[] local=new int[k+1];
        int[] global=new int[k+1];
        for(int i=0;i<nums.size();i++){
            //must be min of (k,i+1).otherwise,it is not guaranteed k subarrays,could be less
            for(int j=Math.min(k, i+1);j>0;j--){
                local[j]=nums.get(i)+(j==i+1?global[j-1]:Math.max(global[j-1],local[j]));
                global[j]=j==i+1?local[j]:Math.max(global[j],local[j]);
            }
        }
        return global[k];
    }

 

Lintcode - Maximum Subarray III

标签:

原文地址:http://www.cnblogs.com/fifi043/p/4976463.html

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