Недавно я попробовал вопрос о наивысшем продукте из 3 элементов. Теперь я пытаюсь сделать это для k элементов. Скажем, из 3 теперь он просит 4 элемента. Я попытался написать общую функцию, чтобы она могла обрабатывать любые k элементов в массиве. Алго должно быть в O (n) точно так же, как и с тремя элементами.Как найти наивысший продукт из k элементов в массиве n длины, где k <n
def highest_product_sol(input):
high = max(input[0],input[1])
low = min(input[0],input[1])
max_prod_2 = input[0] * input[1]
low_prod_2 = input[0] * input[1]
max_prod_3 = max_prod_2 * input[2]
prod_2_high = input[0] * input[1]
prod_2_low = input[0] * input[1]
for i in range(2,len(input)):
val = input[i]
max_prod_3 = max(max_prod_3,max_prod_2*val,low_prod_2*val)
prod_2_high = high * val
prod_2_low = low * val
max_prod_2 = max(max_prod_2,prod_2_high)
low_prod_2 = min(low_prod_2,prod_2_high)
high = max(high,val)
low = min(low,val)
return (max_prod_2,low_prod_2,max_prod_3)
def highest_product_num(input,num):
high = max(input[0:num - 1])
low = min(input[0:num - 1])
print("max",high)
print("min",low)
prod_high_minus_1 = 1
prod_low_minus_1 = 1
for n in range(0,num-1):
prod_high_minus_1 *= input[n]
prod_low_minus_1 *= input[n]
max_prod_n_1 = prod_high_minus_1
min_prod_n_1 = prod_high_minus_1
max_prod_n = prod_high_minus_1 * input[num-1]
for i in range(num,len(input)):
val = input[i]
max_prod_n = max(max_prod_n,max_prod_n_1*val,min_prod_n_1*val)
prod_high_minus_1 = high * val
prod_low_minus_1 = low * val
max_prod_n_1 = max(max_prod_n_1,prod_high_minus_1)
min_prod_n_1 = min(min_prod_n_1,prod_low_minus_1)
high = max(high,val)
low = min(low,val)
return max_prod_n
test_input = [[1,2,3,4,5,6,7,8],[1,-2,3,4,5,100,2,3,1],[-10,-10,1,3,2][1000,7,-6,2,2]]
print(test_input)
for i in test_input:
print(highest_product_num(i,4),"\n")
# correct `results`
# 1680
# 6000
# 600
numpy приемлемый? –
Где эта проблема? У меня такое чувство, что ты все еще не рассказываешь нам все, иначе ты что-то искажаешь. Я хотел бы увидеть оригинальное описание проблемы. –
Я не верю, что O (n) возможно при любом k; У меня нет доказательств, но я бы оценил минимальную границу O (n log min (k, n - k)) или хуже. – ephemient