С точки зрения алгоритма, чтобы найти k
равных элементов:
На любом данном шаге в алгоритме есть некоторое количество равных элементов, скажем, j
. Если j >= k
, все готово. В противном случае вам нужно выбрать какую-то комбинацию ходов, чтобы увеличить j
.
У вас мало гибкости в том, что вы можете сделать. Вы можете только уменьшить максимальный элемент или увеличить минимальный элемент.
Допустим, существует уникальный максимальный элемент (т. Е. Когда в массиве есть только один элемент, равный максимальному элементу). Вы можете увеличить j
(как минимум) на 1, уменьшив его до тех пор, пока он не станет равным второму по величине элементу.
Аналогичным образом, вы можете увеличить j
(как минимум) на 1, увеличив уникальный уникальный минимальный элемент (т. е. когда в массиве есть только один элемент, равный максимальному элементу), пока он не станет равным второму наименьшему элементу.
Следовательно, наименьшее число ходов для достижения (как минимум) 1 увеличения равно один из [уменьшить максимум; увеличить максимальное значение], которое достигает этого.
Например, в массиве [1, 3, 5, 6]
вы можете выбрать:
- Сделайте 2 шага, чтобы увеличить 1, чтобы он равнялся 3:
[3, 3, 5, 6]
- Сделайте 1 ход, чтобы уменьшить 6, чтобы оно равнялось 5:
[1, 3, 5, 5]
В этом случае вы увеличиваете j
на 2 наиболее дешево, уменьшая значение 6.
Но после этого равные максимальные элементы: два элемента равны 5. Уменьшая один из них, вы уменьшаете j
на 2 (поскольку [1, 3, 4, 5]
имеет нет равных элементов); но, снова уменьшая максимум, вы делаете j
таким же, как это было раньше (потому что [1, 3, 4, 4]
снова имеет 2 равных элемента). Итак, вам нужно проделать некоторую работу, чтобы «стоять на месте» (то есть вернуть j
к его предыдущему значению), прежде чем вы сможете затем уменьшить максимум, чтобы увеличить j
.
( Аналогично для минимальных элементов)
Итак, ваш алгоритм может найти (жадное) минимальное количество шагов, чтобы сделать j == k
, решив, [уменьшить максимальные элементы] или [увеличить минимальный элемент]. Я не знаю, является ли жадный минимум на самом деле минимумом, но я не могу придумать очевидного алгоритма, чтобы найти его без жадности, кроме поиска всех возможностей, которые имели бы ужасную вычислительную сложность, так что, вероятно, не то, что это интервью искал.