考虑前缀和,对于每一个i的前缀和s[i],如果要找到一个以j为左端点,以i作为右端点的区间,使得这个区间对应的元素之和为k的倍数,那么就需要满足s[i] % k == s[j] % k,这样二者相减的和肯定是k的整数倍。
所以只需要维护i前面的所有前缀和%k的值即可,如果有一个前缀和模k,且对应的区间长度大于等于2就返回true,找不到则返回false。
给你一个整数数组 nums 和一个整数k,编写一个函数来判断该数组是否含有同时满足下述条件的连续子数组;
1.子数组大小至少为 2。
2.子数组元素总和为k的倍数。
如果存在,返回true;否则,返回 false 。
如果存在一个整数n,令整数x符合x=n×k,则称x是k的一个倍数。0始终视为k的一个倍数。
输入
5 6
23 2 4 6 7
输出
true
说明: [2,4]是一个大小为2的子数组,并且和为6。
输入
5 13
23 2 6 4 7
输出
false
提示
1<nums.lengh≤105
0<nums[i]≤109
0<sum(nums[i])≤231−1
1≤k≤231−1
本题属于以下题库,请选择所需题库进行购买