如果我們計算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};
}
你Q中'O(n)'複雜度的含義是什麼?你想要算法是線性的還是已經有線性的? – 5208760
這意味着他在面試中被問及:) – xenteros
@MateuszKwasniak我想要算法是線性的。並且不使用任何輔助空間 – Dam