Длина самого длинного подмассива со всеми одинаковыми элементами

У меня есть проблема:

Вам задан массив целых чисел A и целое число k. Вы можете уменьшить элементы массива A до k раз, чтобы создать последовательный подмассив, все элементы которого равны. Возвратите длину максимально возможного последовательного подмассива, который вы можете создать таким образом.

Например, если A равно [1,7,3,4,6,5], а k равно 6, вы можете получить [1,7,3,4 -1,6-1-1-1,5-1-1] = [1,7,3,3,3,3], поэтому вы вернете 4.

Какое оптимальное решение?


person go_k    schedule 19.12.2020    source источник
comment
Можете ли вы объяснить пример? почему 4?   -  person Shridhar R Kulkarni    schedule 19.12.2020
comment
[3 4 6 5] подмассив [3,3+1,3+3,3+2] стоимость уменьшения равна 6, чтобы сделать все элементы равными   -  person go_k    schedule 19.12.2020
comment
Какова максимальная длина исходного массива?   -  person VFX    schedule 19.12.2020
comment
N - длина исходного массива, а K - стоимость   -  person go_k    schedule 19.12.2020
comment
Да, я знаю, но я имею в виду, каково максимальное значение N?   -  person VFX    schedule 19.12.2020
comment
Каков ваш подход к грубой силе?   -  person Shridhar R Kulkarni    schedule 19.12.2020
comment
максимальная длина не упоминается в вопросе   -  person go_k    schedule 19.12.2020
comment
подождите, что здесь вход?   -  person Sandrin Joy    schedule 19.12.2020
comment
N K A вводится здесь   -  person Shridhar R Kulkarni    schedule 19.12.2020
comment
Мой подход Вычитание каждого элемента и сохранение в словаре, а затем самая длинная сумма подмассива   -  person go_k    schedule 19.12.2020
comment
со всеми теми же элементами это не имеет для меня никакого смысла   -  person Sandrin Joy    schedule 19.12.2020
comment
имеет смысл взять подмассив [3,4,6,5]   -  person go_k    schedule 19.12.2020
comment
@go_k Не уверен, понял ли я твой метод грубой силы. Вы должны объяснить это лучше. Либо добавьте код, либо алгоритм для него. Если возможно, укажите также временную сложность вашего перебора, чтобы мы могли попытаться его оптимизировать.   -  person Shridhar R Kulkarni    schedule 19.12.2020
comment
И вы пометили это динамическим программированием. Вы уверены, что динамическая прога подходит? Если проблема связана с каким-то сайтом, опубликуйте ссылку, чтобы люди могли попробовать.   -  person Shridhar R Kulkarni    schedule 19.12.2020
comment
возможно, найдите среднее значение, а затем попытайтесь получить как можно больше значений, близких к этому среднему значению? вопрос сформулирован странно, мало игрушечных примеров. делает это раздражающим, чтобы попытаться расшифровать в первую очередь.   -  person Octavio del Ser    schedule 19.12.2020
comment
Это может быть решено за время сложности O (N * lgN), если вам интересно, я могу исправить код на С++ или просто объяснить идею.   -  person VFX    schedule 19.12.2020


Ответы (2)


Подмассив должен быть сделан равным своему младшему элементу, поскольку единственной допустимой операцией является сокращение (а уменьшение самого нижнего элемента приведет к дополнительным затратам). Дано:

a1, a2, a3...an

стоимость снижения составляет:

sum(a1..an) - n * min(a1..an)

Например,

3, 4, 6, 5
sum = 18
min = 3
cost = 18 - 4 * 3 = 6

Один из способов уменьшить сложность с O(n^2) до логарифмического коэффициента: для каждого элемента как самого правого (или самого левого) элемента подмассива-кандидата наилучший двоичный поиск наибольшей длины в пределах стоимости. Для этого нам нужна только сумма, которую мы можем получить из суммы префиксов за O(1), длина (по которой мы уже ищем) и запрос минимального диапазона, который хорошо изучен.

В ответ на комментарии под этим постом, вот демонстрация того, что последовательность затрат, когда мы расширяем подмассив от каждого элемента до крайнего правого, монотонно увеличивается и, следовательно, может быть запрошена с помощью двоичного поиска.

Код JavaScript:

function cost(A, i, j){
  const n = j - i + 1;
  let sum = 0;
  let min = Infinity;
  for (let k=i; k<=j; k++){
    sum += A[k];
    min = Math.min(min, A[k]);
  }
  return sum - n * min;
}

function f(A){
  for (let j=0; j<A.length; j++){
    const rightmost = A[j];
    const sequence = [];
    
    for (let i=j; i>=0; i--)
      sequence.push(cost(A, i, j));
    
    console.log(rightmost + ': ' + sequence);
  }
}

var A = [1,7,3,1,4,6,5,100,1,4,6,5,3];

f(A);

person גלעד ברקן    schedule 19.12.2020
comment
Я сомневаюсь, что бинарный поиск может не работать в некоторых случаях, или я не правильно понял вашу идею. Мне интересно посмотреть, как снизить сложность ниже O (n ^ 2). Можете ли вы написать код C++ для этого, чтобы я мог попробовать некоторые входные данные? - person Shridhar R Kulkarni; 20.12.2020
comment
Спасибо за ответ. Я не до конца понял идею, поэтому не могу перейти к контрпримеру. Не встречный пример, но не могли бы вы отредактировать свой пост, чтобы смоделировать [1,7,3,1,4,6,5,100,1,4,6,5,3] k = 20. Это помогло бы мне понять оптимизацию . - person Shridhar R Kulkarni; 20.12.2020
comment
@ShridharRKulkarni Я добавил раздел в свой ответ в ответ на ваш комментарий. - person גלעד ברקן; 20.12.2020
comment
Спасибо. Проголосовал! Теперь я понял всю идею. Для каждого диапазона мы получаем min, используя запрос минимального диапазона. Используя это min, мы вычисляем максимальную длину, возможную при заданной стоимости. Кроме того, нам нужно иметь массив сумм префиксов для части sum(a1..an). Поправьте меня, если ошибаюсь. - person Shridhar R Kulkarni; 20.12.2020
comment
@ShridharRKulkarni хороший момент - да, мы можем использовать сумму префикса, чтобы получить компонент суммы в O (1). - person גלעד ברקן; 20.12.2020

def cost(a, i, j):
  n = j - i 
  s = 0
  m = a[i]
  for k in range(i,j):
    s += a[k]
    m = min(m, a[k])
  return s - n * m;

def solve(n,k,a):
 m=1
 for i in range(n):
  for j in range(i,n+1):
   if cost(a,i,j)<=k:
    x = j - i 
    if x>m:
     m=x
 return m

Это мое решение python3 в соответствии с вашими спецификациями.

person Ashutosh Bichare    schedule 20.12.2020
comment
У вас есть объяснение того, как работает этот код? - person ggorlen; 20.12.2020