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

Maximum Subarray II

时间:2016-04-02 12:07:58      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:

Given an array of integers, find two non-overlapping subarrays which have the largest sum.
The number in each subarray should be contiguous.
Return the largest sum.

For given [1, 3, -1, 2, -1, 2], the two subarrays are [1, 3] and [2, -1, 2] or [1, 3, -1, 2] and [2], they both have the largest sum 7.

技术分享

思路:遍历每一个分割线,分别求分割线左边的最大子数组和分割线右边的最大子数组。为了实现O(n) 的时间复杂度,可以创建left[] 、right[] 数组,其中left[i] 表示从0 ~ i 的数组的子数组最大值,right[j] 表示nums.length - 1 ~ j 的数组的子数组最大值。

 1 public class Solution {
 2     /**
 3      * @param nums: A list of integers
 4      * @return: An integer denotes the sum of max two non-overlapping subarrays
 5      */
 6     public int maxTwoSubArrays(ArrayList<Integer> nums) {
 7         if (nums == null || nums.size() == 0) {
 8             return 0;
 9         }
10         int[] left = new int[nums.size()];
11         int[] right = new int[nums.size()];
12         int sum = 0, max = Integer.MIN_VALUE;
13         for (int i = 0; i < nums.size(); i++) {
14             sum = sum + nums.get(i);
15             max = Math.max(max, sum);
16             sum = Math.max(sum, 0);
17             left[i] = max;
18         }
19         sum = 0;
20         max = Integer.MIN_VALUE;
21         for (int i = nums.size() - 1; i >= 0; i--) {
22             sum = sum + nums.get(i);
23             max = Math.max(max, sum);
24             sum = Math.max(sum, 0);
25             right[i] = max;
26         }
27         max = Integer.MIN_VALUE;
28         for (int i = 0; i < nums.size() - 1; i++) {
29             max = Math.max(left[i] + right[i + 1], max);
30         }
31         return max;
32     }
33 }
 1 public class Solution {
 2     /**
 3      * @param nums: A list of integers
 4      * @return: An integer denotes the sum of max two non-overlapping subarrays
 5      */
 6     public int maxTwoSubArrays(ArrayList<Integer> nums) {
 7         // write your code
 8         int size = nums.size();
 9         int[] left = new int[size];
10         int[] right = new int[size];
11         int sum = 0;
12         int minSum = 0;
13         int max = Integer.MIN_VALUE;
14         for(int i = 0; i < size; i++){
15             sum += nums.get(i);
16             max = Math.max(max, sum - minSum);
17             minSum = Math.min(sum, minSum);
18             left[i] = max;
19         }
20         sum = 0;
21         minSum = 0;
22         max = Integer.MIN_VALUE;
23         for(int i = size - 1; i >= 0; i--){
24             sum += nums.get(i);
25             max = Math.max(max, sum - minSum);
26             minSum = Math.min(sum, minSum);
27             right[i] = max;
28         }
29         max = Integer.MIN_VALUE;
30         for(int i = 0; i < size - 1; i++){
31             max = Math.max(max, left[i] + right[i + 1]);
32         }
33         return max;
34     }
35 }

 

Maximum Subarray II

标签:

原文地址:http://www.cnblogs.com/FLAGyuri/p/5347267.html

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