Если мы рассчитали среднее значение k
элементов from 0 to k
, что мы можем сказать о среднем from 1 to k
, или около from 0 to k + 1
? Оба средних значения: 1 to k
и 0 to k + 1
равны или больше среднего количества первых k
elemnts. Почему? Переход от подмножества from 0 to k
к подмножеству from 1 to k
, означает удаление наименее элемента, поэтому не может уменьшить общее среднее значение. Переход от подмножества from 0 to k
к подмножеству from 0 to k + 1
означает добавление элемента, который не меньше, чем любой другой, поэтому он может не уменьшать общее среднее значение.
Известно ли, какое число из данного массива должно быть частью результата? Да, это последнее меньше или равно цели. Зачем? Когда он равен, мы делаем Когда он не равен, нам нужно иметь как более крупные, так и нижние элементы.
Затем мы поддерживаем среднее увеличение, добавляя элементы с правой стороны и уменьшаясь с левой стороны.
public static int[] findMean(int[] input, int target) {
int firstGreater = 0;
int n = input.length;
while(firstGreater < n && input[firstGreater] <= target) firstGreater++; // use binary search instead!
if(firstGreater == 0 || firstGreater == n) return new int[]{-1,-1};
int left = firstGreater - 1, right = firstGreater;
long sum = input[left];
while ((right < n &&(right - left) * target > sum) || (left > 0 && (right - left) * target < sum)) {
if((right - left) * target > sum) sum += input[right++];
else sum += input[--left];
}
if((right - left) * target != sum) {
left = right = -1;
}
return new int[]{left, right - 1};
}
Что означает сложность 'O (n)' в вашем Q? Вы хотите, чтобы алгоритм был линейным, или у вас уже есть линейный? – 5208760
Это значит, что его спросили об этом на интервью :) – xenteros
@MateuszKwasniak Я хочу, чтобы алгоритм был линейным. и без использования какого-либо вспомогательного пространства – Dam