和可被K整除的子数组
思路:定义一个数组(int[ ] map)用它的下标表示 相邻元素组成的新数组的和(sum)除K得到的余数(key)。定义map[0]=1(余数为0数目加一)。其余按系统默认均为0。但在不论相邻元素组成的新数组的和(sum)是否为0后,map[key]都要加一(因为之前已经有和(sum)余这个数了,新加的元素一定可以组成一个数组,它的和一定满足为5的倍数)。这样就相等于减少了一个for(j=i;j<nums.length;j++)循环。减小了算法的时间复杂度。
class Solution {
public int subarraysDivByK(int[] nums, int k) {
int[] map=new int[k];
int sum=0;
int number=0;
map[0]=1;
for(int i=0;i<nums.length;i++){
sum+=nums[i];
int key=(sum%k+k)%k;
number+=map[key];
map[key]++;
}
return number;
}
}