[leetcode]523. Continuous Subarray Sum

从数组中找到子串的和是给定值得倍数

哈希表法的精髓就是,到ab两个位置的和对target取余结果一样的话,ab之间的和肯定是target的整数倍

public boolean checkSubarraySum(int[] nums, int k) {
        int l = nums.length;
        /*
        两种方法,动态规划和哈希表
        动态规划就是把长度为2-数组size的所有情况的所有组合遍历一遍
        dp[i]代表以i开头的组合,外层循环是len,dp[i]更新用上次的加上当前元素
        哈希表更快
        遍历整个数组,依次加当前数组元素并将相加和求余k,求余结果只有0~k-1这k中情况,
        将求余结果存入Hash Table中。
        如果遍历到当前位置求余结果已经在Hash Table中,
        表明从上一求余结果相同的位置到当前位置的子数组相加和是k的倍数,
        否则将求余结果存入Hash Table。
         */
        Map<Integer,Integer> map = new HashMap<>();
        //k=0的情况,假设-1位置有一个0
        map.put(0,-1);
        int sum = 0;
        for (int i = 0; i < l; i++) {
            sum+=nums[i];
            if (k!=0) sum%=k;
            if (map.containsKey(sum))
            {
                if (i-map.get(sum)>1)
                    return true;
            }
            else {
                map.put(sum,i);
            }
        }
        return false;
    }

 

posted @ 2018-03-02 10:12  stAr_1  阅读(163)  评论(0编辑  收藏  举报