zoukankan      html  css  js  c++  java
  • Lintcode: Maximum Subarray Difference

    Given an array with integers.
    
    Find two non-overlapping subarrays A and B, which |SUM(A) - SUM(B)| is the largest.
    
    Return the largest difference.
    
    Note
    The subarray should contain at least one number
    
    Example
    For [1, 2, -3, 1], return 6
    
    Challenge
    O(n) time and O(n) space.

    思路:把数组分成两部分,可以从i和i+1(0<=  i < len-1)之间分开,a[0, i] a[i+1, len-1],然后分别求两个子数组中的最大子段和,以及最小字段和,然后求差的最大值即可。

     1 public class Solution {
     2     /**
     3      * @param nums: A list of integers
     4      * @return: An integer indicate the value of maximum difference between two
     5      *          Subarrays
     6      */
     7     public int maxDiffSubArrays(ArrayList<Integer> nums) {
     8         // write your code
     9         if (nums==null || nums.size()==0) return 0;
    10         int len = nums.size();
    11         int[] lGlobalMax = new int[len];
    12         int[] lGlobalMin = new int[len];
    13         int lLocalMax = nums.get(0);
    14         int lLocalMin = nums.get(0);
    15         lGlobalMax[0] = lLocalMax;
    16         lGlobalMin[0] = lLocalMin;
    17         for (int i=1; i<len; i++) {
    18             lLocalMax = Math.max(lLocalMax+nums.get(i), nums.get(i));
    19             lGlobalMax[i] = Math.max(lLocalMax, lGlobalMax[i-1]);
    20             
    21             lLocalMin = Math.min(lLocalMin+nums.get(i), nums.get(i));
    22             lGlobalMin[i] = Math.min(lLocalMin, lGlobalMin[i-1]);
    23         }
    24         
    25         int[] rGlobalMax = new int[len];
    26         int[] rGlobalMin = new int[len];
    27         int rLocalMax = nums.get(len-1);
    28         int rLocalMin = nums.get(len-1);
    29         rGlobalMax[len-1] = rLocalMax;
    30         rGlobalMin[len-1] = rLocalMin;
    31         for (int i=len-2; i>=0; i--) {
    32             rLocalMax = Math.max(rLocalMax+nums.get(i), nums.get(i));
    33             rGlobalMax[i] = Math.max(rLocalMax, rGlobalMax[i+1]);
    34             
    35             rLocalMin = Math.min(rLocalMin+nums.get(i), nums.get(i));
    36             rGlobalMin[i] = Math.min(rLocalMin, rGlobalMin[i+1]);
    37         }
    38         
    39         int maxDiff = Integer.MIN_VALUE;
    40         for (int i=0; i<len-1; i++) {
    41             if (maxDiff < Math.abs(lGlobalMax[i]-rGlobalMin[i+1]))
    42                 maxDiff = Math.abs(lGlobalMax[i]-rGlobalMin[i+1]);
    43                 
    44              
    45             if (maxDiff < Math.abs(lGlobalMin[i]-rGlobalMax[i+1]))
    46                 maxDiff = Math.abs(lGlobalMin[i]-rGlobalMax[i+1]);
    47         }
    48         return maxDiff;
    49     }
    50 }
  • 相关阅读:
    session概述
    Flask实现登录功能【附完整Demo】(转)
    Python __repr__()方法:显示属性(转)
    Python使用SQLAlchemy连接数据库CRUD
    网络基础知识集合
    面向切面编程AOP
    SQL基础 insert table_name_1 (field1,field2,...) select value1,value2,... from table_name_2 ...
    java中char类型的变量为什么可以赋值为整型数字?
    iOS应用生命周期
    视图生命周期与视图控制器生命周期
  • 原文地址:https://www.cnblogs.com/EdwardLiu/p/4336961.html
Copyright © 2011-2022 走看看