1
1
# Time: O(r * (n + q)), r is the max of nums
2
2
# Space: O(r * n)
3
3
4
- import itertools
5
-
6
-
7
4
class Solution (object ):
8
5
def minDifference (self , nums , queries ):
9
6
"""
10
7
:type nums: List[int]
11
8
:type queries: List[List[int]]
12
9
:rtype: List[int]
13
10
"""
11
+ INF = float ("inf" )
14
12
prefix = [[0 ]* (max (nums )+ 1 )]
15
13
for num in nums :
16
14
prefix .append (prefix [- 1 ][:])
17
15
prefix [- 1 ][num ] += 1
18
16
result = []
19
17
for l , r in queries :
20
- sub_nums = [num for cnt1 , cnt2 , num in itertools .izip (prefix [l ], prefix [r + 1 ], xrange (len (prefix [0 ]))) if cnt1 < cnt2 ]
21
- result .append (min ([b - a for a , b in itertools .izip (sub_nums , itertools .islice (sub_nums , 1 , len (sub_nums )))] or [- 1 ]))
18
+ min_diff , prev = INF , - 1
19
+ for num in xrange (len (prefix [0 ])):
20
+ if not (prefix [l ][num ] < prefix [r + 1 ][num ]):
21
+ continue
22
+ if prev != - 1 :
23
+ min_diff = min (min_diff , num - prev )
24
+ prev = num
25
+ result .append (min_diff if min_diff != INF else - 1 )
22
26
return result
23
27
24
28
@@ -43,9 +47,10 @@ def minDifference(self, nums, queries):
43
47
min_diff , prev = INF , - 1
44
48
for num in xrange (len (idxs )):
45
49
i = bisect .bisect_left (idxs [num ], l )
46
- if i < len (idxs [num ]) and idxs [num ][i ] <= r :
47
- if prev != - 1 :
48
- min_diff = min (min_diff , num - prev )
49
- prev = num
50
+ if not (i < len (idxs [num ]) and idxs [num ][i ] <= r ):
51
+ continue
52
+ if prev != - 1 :
53
+ min_diff = min (min_diff , num - prev )
54
+ prev = num
50
55
result .append (min_diff if min_diff != INF else - 1 )
51
56
return result
0 commit comments