• LintCode-Subarray Sum


    Given an integer array, find a subarray where the sum of numbers is zero. Your code should return the index of the first number and the index of the last number.

    Example

    Given [-3, 1, 2, -3, 4], return [0, 2] or [1, 3].

    Solution 1 (nlog(n)):

     1 class Element implements Comparable<Element>{
     2     int index;
     3     int value;
     4     public Element(int i, int v){
     5         index = i;
     6         value = v;
     7     }
     8     public int compareTo(Element other){
     9         return this.value-other.value;
    10     }
    11     public int getIndex(){
    12         return index;
    13     }
    14     public int getValue(){
    15         return value;
    16     }
    17 }
    18 
    19 public class Solution {
    20     /**
    21      * @param nums: A list of integers
    22      * @return: A list of integers includes the index of the first number
    23      *          and the index of the last number
    24      */
    25     public ArrayList<Integer> subarraySum(int[] nums) {
    26         ArrayList<Integer> res = new ArrayList<Integer>();
    27         if (nums==null || nums.length==0) return res;
    28         int len = nums.length;
    29         Element[] sums = new Element[len+1];
    30         sums[0] = new Element(-1,0);
    31         int sum = 0;
    32         for (int i=0;i<len;i++){
    33             sum += nums[i];
    34             sums[i+1] = new Element(i,sum);
    35         }
    36         Arrays.sort(sums);
    37         for (int i=0;i<len;i++)
    38             if (sums[i].getValue()==sums[i+1].getValue()){
    39                 int start = Math.min(sums[i].getIndex(),sums[i+1].getIndex())+1;
    40                 int end = Math.max(sums[i].getIndex(),sums[i+1].getIndex());
    41                 res.add(start);
    42                 res.add(end);
    43                 return res;
    44             }
    45 
    46         return res;
    47     }
    48 }

    Solution 2 ( n, but more memory):

     1 public class Solution {
     2     /**
     3      * @param nums: A list of integers
     4      * @return: A list of integers includes the index of the first number
     5      *          and the index of the last number
     6      */
     7     public ArrayList<Integer> subarraySum(int[] nums) {
     8         ArrayList<Integer> res = new ArrayList<Integer>();
     9         if (nums==null || nums.length==0) return res;
    10         int len = nums.length;
    11         Map<Integer,List<Integer>> map = new HashMap<Integer,List<Integer>>();
    12         List<Integer> aList = new ArrayList<Integer>();
    13         aList.add(-1);
    14         map.put(0,aList);
    15         int sum =0;
    16         for (int i=0;i<len;i++){
    17             sum += nums[i];
    18             //check the exists of current sum.
    19             if (map.containsKey(sum)){
    20                 int start = map.get(sum).get(0)+1;
    21                 res.add(start);
    22                 res.add(i);
    23                 return res;
    24             } else {
    25                 aList = new ArrayList<Integer>();
    26                 aList.add(i);
    27                 map.put(sum,aList);
    28             }
    29         }
    30 
    31         return res;
    32     }
    33 }
  • 相关阅读:
    Redis 安装和启动
    有序的map类--LinkedHashMap
    Springmvc
    工厂模式
    Top K
    判断链表是否有环
    注解
    Spring 事务
    热点账户高并发解决方案
    sql优化
  • 原文地址:https://www.cnblogs.com/lishiblog/p/4189339.html
Copyright © 2020-2023  润新知