鉴于AP系列的第一个要素和共同点。如何找到属于AP系列的排序数组(允许重复)中的元素总数。是否可以在O(N)
以下的时间内完成?
到目前为止我尝试了什么
if (arr[i]-a)%d == 0:
count+=1
Constraints: 1<=d<=10^5 , 0<=a<=10^5
例如:a = 1
,d = 3
[1,2,4,6,7,7,9,10]
答案:5
基本上我想查找a+dx
形式的总数,因此步长可以是d
答案 0 :(得分:0)
除非你删除了重复,否则我认为这个问题没有比O(N)
更快的解决方案。
话虽这么说,这是我能提出的最快的实施方案:
def is_part_of_sequence(a, d, x):
return (x%d) == a
def get_length(a, d, l):
# going to be using this a few times in this function
ips = is_part_of_sequence
# get the length of the list
n = len(l)
# get the first value in the sequence
min_seq_ind, min_seq_value = next(
(i, v) for i, v in enumerate(l)
if v == a
)
# get the last value in the sequence
max_seq_ind, max_seq_value = next(
(n-i-1, v) for i, v in enumerate(reversed(l))
if ips(a, d, v)
)
min_length = ((max_seq_value - a)//d) + 1 # this is the minimum length
# check to see if min_length is the correct answer- if so, short circuit
if min_length == (max_seq_ind - min_seq_ind + 1):
return min_length
count = 2
count += sum(1 if ips(a, d, l[i]) else 0 for i in range(min_seq_ind+1, max_seq_ind))
return count
这里唯一的优化是,在序列不包含重复的情况下,该算法是恒定时间,因为它可能会短路。