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.
考点是前缀和。
Solution 1: faster, uses more space.

public class Solution {
    public ArrayList<Integer> subarraySum(int[] nums) {
        ArrayList<Integer> res = new ArrayList<Integer>();
        if (nums == null || nums.length == 0) {
            return res;
        }
        Map<Long, Integer> prefixSumMap = new HashMap<Long, Integer>();
        long sum = 0;
        for (int i = 0; i < nums.length; i++) {
            sum += nums[i];
            if (sum == 0) {
                res.add(0);
                res.add(i);
                break;
            }
            if (prefixSumMap.containsKey(sum)) {
                res.add(prefixSumMap.get(sum)+1);
                res.add(i);
                break;
            } else {
                prefixSumMap.put(sum, i);
            }
        }
        return res;
    }
}

Solution 2: slower, uses less space

public class Solution {
    class Element implements Comparable<Element>{
      private int index;
      private int val;

      Element (int index, int val) {
        this.index = index;
        this.val = val;
      }

      public int getVal() {
        return val;
      }

      public int getIndex() {
        return index;
      }

      public int compareTo(Element e) {
        return val - e.getVal();
      }
    }

    public ArrayList<Integer> subarraySum(int[] nums) {
        ArrayList<Integer> res = new ArrayList<Integer>();
        if (nums == null || nums.length == 0) {
          return res;
        }
        int sum = 0;
        Element[] eles = new Element[nums.length];
        for (int i = 0; i < nums.length; i++) {
          sum += nums[i];
          eles[i] = new Element(i, sum);
        }
        Arrays.sort(eles);
        for (int i = 0; i < eles.length; i++) {
          if (eles[i].getVal() == 0) {
            res.add(0);
            res.add(eles[i].getIndex());
            break;
          }
          if (i > 0 && eles[i].getVal() == eles[i-1].getVal()) {
            res.add(eles[i].getIndex());
            res.add(eles[i-1].getIndex());
            break;
          }
        }
        return res;
    }
}

One thought on “Lintcode: subarray sum

Leave a comment