Skip to content

Commit b5e21dc

Browse files
authored
Update k-divisible-elements-subarrays.py
1 parent 2fcdd6a commit b5e21dc

File tree

1 file changed

+14
-22
lines changed

1 file changed

+14
-22
lines changed

Python/k-divisible-elements-subarrays.py

Lines changed: 14 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -45,21 +45,18 @@ def check(nums, lookup, l, i):
4545
return all(any(nums[i+k] != nums[j+k] for k in xrange(l)) for j in lookup)
4646

4747
result = 0
48-
base = P
48+
cnt, h = [0]*len(nums), [0]*len(nums)
4949
for l in xrange(1, len(nums)+1):
5050
lookup = collections.defaultdict(list)
51-
cnt = h = 0
52-
for i in xrange(len(nums)):
53-
cnt += (nums[i]%p == 0)
54-
h = (h*P+nums[i])%MOD
55-
if i-l >= 0:
56-
cnt -= (nums[i-l]%p == 0)
57-
h = (h-nums[i-l]*base)%MOD
58-
if i < l-1 or cnt > k or not check(nums, lookup[h], l, i-l+1):
51+
for i in xrange(len(nums)-l+1):
52+
cnt[i] += (nums[i+l-1]%p == 0)
53+
if cnt[i] > k:
5954
continue
60-
lookup[h].append(i-l+1)
55+
h[i] = (h[i]*P+nums[i+l-1])%MOD
56+
if not check(nums, lookup[h[i]], l, i):
57+
continue
58+
lookup[h[i]].append(i)
6159
result += 1
62-
base = (base*P)%MOD
6360
return result
6461

6562

@@ -76,19 +73,14 @@ def countDistinct(self, nums, k, p):
7673
"""
7774
MOD, P = 10**9+7, 200
7875
result = 0
79-
base = P
76+
cnt, h = [0]*len(nums), [0]*len(nums)
8077
for l in xrange(1, len(nums)+1):
8178
lookup = set()
82-
cnt = h = 0
83-
for i in xrange(len(nums)):
84-
cnt += (nums[i]%p == 0)
85-
h = (h*P+nums[i])%MOD
86-
if i-l >= 0:
87-
cnt -= (nums[i-l]%p == 0)
88-
h = (h-nums[i-l]*base)%MOD
89-
if i < l-1 or cnt > k:
79+
for i in xrange(len(nums)-l+1):
80+
cnt[i] += (nums[i+l-1]%p == 0)
81+
if cnt[i] > k:
9082
continue
91-
lookup.add(h) # assumed no collision
83+
h[i] = (h[i]*P+nums[i+l-1])%MOD
84+
lookup.add(h[i])
9285
result += len(lookup)
93-
base = (base*P)%MOD
9486
return result

0 commit comments

Comments
 (0)