美文网首页
[刷题防痴呆] 0523 - 连续的子数组和 (Continuo

[刷题防痴呆] 0523 - 连续的子数组和 (Continuo

作者: 西出玉门东望长安 | 来源:发表于2021-12-26 02:23 被阅读0次

    题目地址

    https://leetcode.com/problems/continuous-subarray-sum/

    题目描述

    523. Continuous Subarray Sum
    
    Given an integer array nums and an integer k, return true if nums has a continuous subarray of size at least two whose elements sum up to a multiple of k, or false otherwise.
    
    An integer x is a multiple of k if there exists an integer n such that x = n * k. 0 is always a multiple of k.
    
     
    
    Example 1:
    
    Input: nums = [23,2,4,6,7], k = 6
    Output: true
    Explanation: [2, 4] is a continuous subarray of size 2 whose elements sum up to 6.
    Example 2:
    
    Input: nums = [23,2,6,4,7], k = 6
    Output: true
    Explanation: [23, 2, 6, 4, 7] is an continuous subarray of size 5 whose elements sum up to 42.
    42 is a multiple of 6 because 42 = 7 * 6 and 7 is an integer.
    Example 3:
    
    Input: nums = [23,2,6,4,7], k = 13
    Output: false
    
    

    思路

    • 前缀和.
    • 同余定理: subNum % k == 0,等价于 sum[j+1] % k == sum[i] % k.

    关键点

    代码

    • 语言支持:Java
    class Solution {
        public boolean checkSubarraySum(int[] nums, int k) {
            int n = nums.length;
            int[] sums = new int[n + 1];
            for (int i = 1; i <= n; i++) {
                sums[i] = sums[i - 1] + nums[i - 1];
            }
            Map<Integer, Integer> map = new HashMap<>();
            for (int i = 0; i <= n; i++) {
                int sumMod = sums[i] % k;
                if (map.containsKey(sumMod) && i > map.get(sumMod) + 1) {
                    return true;
                }
                map.putIfAbsent(sumMod, i);
            }
    
            return false;
        }
    }
    

    相关文章

      网友评论

          本文标题:[刷题防痴呆] 0523 - 连续的子数组和 (Continuo

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