523. Continuous Subarray Sum
题目描述: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.
Example 2:
Input: [23, 2, 6, 4, 7], k=6 Output: True Explanation: Because [23, 2, 6, 4, 7] is an continuous subarray of size 5 and sums up to 42.
题目大意:给定一个数组,一个k,找出数组中是否存在长度大于等于2的连续的子数组,使连续子数组的和是k的倍数。
思路:建立一个runningSum变量,记录遍历过程中连续子数组和模k的结果,并将结果存储到Hashmap中,如果发现当前下标为j的runningSum,在前面已经出现,则代表在之前出现的位置i到当前位置j,(i,j]处,存在连续子数组和可以整除k。
代码
package DP; import java.util.HashMap; import java.util.Map; /** * @author OovEver * 2018/1/3 10:34 */ public class LeetCode523 { public static boolean checkSubarraySum(int[] nums, int k) { Map<Integer, Integer> map = new HashMap<>(); map.put(0, -1); int runningSum = 0; for(int i=0;i<nums.length;i++) { runningSum += nums[i]; if (k != 0) { runningSum %= k; } Integer prev = map.get(runningSum); if (prev != null) { // 连续子数组的长度需要大于2 if (i - prev > 1) { return true; } } else { map.put(runningSum, i); } } return false; } }