美文网首页
Prefix Sum + HashMap

Prefix Sum + HashMap

作者: ziru_SUN | 来源:发表于2018-02-26 12:23 被阅读0次
    1. hashmap<count,index>
    2. map.containsKey()时更新最值不put,没有时put
    3. 根据后面找前面,不用初始化prefix数组或hashmap

    560. Subarray Sum Equals K

    Given an array of integers and an integer k, you need to find the total number of continuous subarrays whose sum equals to k.

    Example 1:
    Input:nums = [1,1,1], k = 2
    Output: 2

    思路一致,不过对于hashmap的设计需要注意,跟其他题目不一样的地方是不是找最长的subarray,所以设计要不一样。

        public int subarraySum(int[] nums, int k) {
            // map to store prefix sum array
            // key is prefix sum value is index
            Map<Integer, Integer> map = new HashMap<>();
            int sum = 0;
            int res = 0;
            map.put(0, 1);
            for (int i = 0; i < nums.length; i++) {
                sum += nums[i];
                if (map.containsKey(sum - k)) {
                    res += map.get(sum - k);
                }
                map.put(sum, map.getOrDefault(sum, 0) + 1);
            }
            return res;
        }
    

    Given a list of non-negative numbers and a target integer k, write a function to check if the array has a continuous subarray of size at least 2 that sums up to the multiple of k, that is, sums up to n*k where n is also an integer.
    Example 1:
    Input: [23, 2, 4, 6, 7], k=6
    Output: True
    Explanation: Because [2, 4] is a continuous subarray of size 2 and sums up to 6.

    余数放在map里
    ex 【2,4】2%6 = 2 (4+2)% 6 = 0

        public boolean checkSubarraySum(int[] nums, int k) {
            if (nums == null || nums.length == 0) {
                return false;
            }
            Map<Integer, Integer> map = new HashMap<>();
            int sum = 0;
            // hold the position
            map.put(0, -1);
            for (int i = 0; i < nums.length; i++) {
                sum += nums[i];
                if (k != 0) {
                    sum = sum % k;                
                }
                if (map.containsKey(sum)) {
                    // make sure at least subarray has more than 2 elements
                    if (i - map.get(sum) > 1) {
                        return true;
                    }
                } else {
                    map.put(sum, i);
                }
            }
            return false;
        }
    

    325. Maximum Size Subarray Sum Equals k

    Given nums = [1, -1, 5, -2, 3], k = 3,
    return 4. (because the subarray [1, -1, 5, -2] sums to 3 and is the longest)

    Subarray类题目需要想到前缀和数组,优化➕Hashmap
    sum(i~j) = PrefixSum(j+1) - PrefixSum(i) PrefixSum[0] = 0

    public int maxSubArrayLen(int[] nums, int k) {
              if(nums == null || nums.length == 0) return 0;
              int length = nums.length, sum = 0, maxSubLen = 0;
              //Using a hash map to store the sum of all the values before and include nums[i]
              Map<Integer, Integer> map = new HashMap();
              for(int i = 0; i < length; i++) {
                  sum += nums[i];
                  if(sum == k) {
                      maxSubLen = Math.max(maxSubLen, i + 1);
                  } else if(map.containsKey(sum - k)) {
                      maxSubLen = Math.max(maxSubLen, i - map.get(sum - k));
                  }
                  if(!map.containsKey(sum)) {
                      map.put(sum, i);
                  }
              }
              return maxSubLen;
          }
    

    525. Contiguous Array

    Given a binary array, find the maximum length of a contiguous subarray with equal number of 0 and 1.
    给一个binary数组,找出最长的子数组,0,1数量相等

    1 max初始化为0,如果(0,0,0,0)情况
    2 contain时不put
    3 用一个count变量记录就够了

        public int findMaxLength(int[] nums) {
            if (nums == null || nums.length == 0) {
                return 0;
            }
            int count = 0;
            int max = 0;
            Map<Integer, Integer> map = new HashMap<>();
            map.put(0, -1);
            for (int i = 0; i < nums.length; i++) {
                if (nums[i] == 0) {
                    count++;
                } else {
                    count--;
                }
                if (map.containsKey(count)) {
                    // if contains no put, get the leftmost 
                    max = Math.max(max, i - map.get(count));
                    
                } else {
                    map.put(count, i);
                }
            }
            return max;
        }
    

    相关文章

      网友评论

          本文标题:Prefix Sum + HashMap

          本文链接:https://www.haomeiwen.com/subject/qkiznxtx.html