1. 程式人生 > 其它 >【LeetCode】523. 連續的子陣列和

【LeetCode】523. 連續的子陣列和

523. 連續的子陣列和

知識點:陣列;字首和;

題目描述

給你一個整數陣列 nums 和一個整數k ,編寫一個函式來判斷該陣列是否含有同時滿足下述條件的連續子陣列:

子陣列大小 至少為 2 ,且
子陣列元素總和為 k 的倍數。
如果存在,返回 true ;否則,返回 false 。

如果存在一個整數 n ,令整數 x 符合 x = n * k ,則稱 x 是 k 的一個倍數。0 始終視為 k 的一個倍數。

示例
輸入:nums = [23,2,4,6,7], k = 6
輸出:true
解釋:[2,4] 是一個大小為 2 的子陣列,並且和為 6 。

輸入:nums = [23,2,6,4,7], k = 6
輸出:true
解釋:[23, 2, 6, 4, 7] 是大小為 5 的子陣列,並且和為 42 。 
42 是 6 的倍數,因為 42 = 7 * 6 且 7 是一個整數。

輸入:nums = [23,2,6,4,7], k = 13
輸出:false

解法一:字首和

連續子陣列+和 --> 字首和;這個題是要我們返回是否存在,比較的是子陣列大小,那我們的value值就不能再是值為某數的次數了,而是元素的索引,這樣才能得到其大小;

class Solution {
    public boolean checkSubarraySum(int[] nums, int k) {
        Map<Integer,Integer> map = new HashMap<>();
        map.put(0,-1);
        int presum = 0;
        for(int i = 0; i < nums.length; i++){
            presum += nums[i];
            int mod = (presum % k + k) % k;  //餘數調整;
            if(map.containsKey(mod)){
                if(i - map.get(mod) >= 2) return true;
                continue;    
                //細節,如果長度沒有超過2,但是已經有這個餘數了,就跳出此次迴圈;
                //因為我們要儲存最小的索引,不能在這裡更新;
            }
            map.put(mod, i);
        }
        return false;
    }
}

時間複雜度:0(N);

體會

連續子陣列+和 --> 字首和