974Subarray Sums Divisible by K 和可以被K整除的子数组数
leetcode吧
全部回复
仅看楼主
level 6
milk_bread 楼主
面对medium的题目始终抱有不可小觑的心。这次周赛顺利做好两道easy的以后 想如果能再拿下这道medium那么是不是可以进1000了?
给一个都是整数的数组,返回 和可以被K整除的子数组 数。
Given an array A of integers, return the number of (contiguous, non-empty) subarrays that have a sum divisible by K.
Example 1:
Input: A = [4,5,0,-2,-3,1], K = 5
Output: 7
Explanation: There are 7 subarrays with a sum divisible by K = 5:[4, 5, 0, -2, -3, 1], [5], [5, 0], [5, 0, -2, -3], [0], [0, -2, -3], [-2, -3]
Note:
数组最长30000。如果O(n^2) 那时间委实长久。
1 <= A.length <= 30000
-10000 <= A[i] <= 10000
2 <= K <= 10000
我依然写了个O(n^2)的算法。优化一下就是先循环的时候 把每个元素取模了。这样在求和的时候会不会加的更快?
public int SubarraysDivByK(int[] A, int K) {
int nums=0;
for(int i=0;i<A.Length;i++){
A[i]=A[i]%K;
if(A[i]==0) nums++;
}
for(int i=0;i<A.Length;i++){
int sum=A[i];
for(int j=i+1;j<A.Length;j++){
sum+=A[j];
if(sum%K==0) nums++;
}
}
return nums;
}
2019年01月15日 07点01分 1
level 13
现在大家水平这么高了啊。我以前做对三道 速度稍微快点就200名附近
2019年01月15日 18点01分 2
可能上一期有两道easy吧 在我和上面那道题目纠缠的时候。看到比赛结果页面前七页的人都已经21分了 即四道题都做完了。 我也很绝望的。
2019年01月16日 02点01分
level 13
这题我说个思路吧。假设数组10个数。把前0,1,2...10个数的和分别记录下来。一共是11个和,第一个和是0。满足条件的数组,就是这11个和取其中两个,他们的差能被K整除。
所以,你建一个map,记录这11个和对K取模的余数,余数相等就是一个解。剩下就是对map扫一遍,找组合的数量。
总时间是线性的
2019年01月16日 02点01分 3
哇 这么绕的方法 大佬是怎么想出来的呀。 而且看solution里面也是这样的,难道我错过了什么重要的数学公式或者算法? 但是如果我下次记起这个算法有类似的或许可以举一反三。 这种方法感觉就是,你想知道中间的部分,但是你只知道从头开始的各个情况。 但是你用差异来算出中间的情况。机智呀。
2019年01月25日 07点01分
回复 milk_bread :其实不难想的。记录和是很常见的做法。题目做多一点就自然能想到。
2019年01月25日 08点01分
level 1
var subarraysDivByK = function(A, K) {
var res=0;
for(var i=0;i<=A.length-1;i++){
if(A[i]%K==0){
res++;
}
var sum=A[i];
for(var j=i+1;j<A.length;j++){
sum+=A[j];
if(sum%K==0){
res++;
}
}
sum=0;
}
return res;
};
1 <= A.length <= 30000
-10000 <= A[i] <= 10000
2 <= K <= 10000
最近刷的人都
魔怔
了,上来先看看能不能暴力算法解决因为题目限制是之前有几道比30000还长的数组暴力算法是可以过的
结果超时[喷]还是看了答案
2019年01月24日 08点01分 4
顺便感觉整个最近1年新加的medium难度提升了一截,但又不到hard做起来挺难受的;easy整体感觉2级分化,要么**到你会不会用这门语言,要么直接比肩medium
2019年01月24日 08点01分
嗯 对的 暴力算法 硬算,憨算是我最拿手的 [黑线]
2019年01月25日 07点01分
1