[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; }