k
要素の平均を計算した場合、平均について、またはについてfrom 0 to k
何がわかりますか? 平均との両方が、最初の要素の平均以上です。なんで?サブセットからサブセットに移動することは、最小の要素を削除することを意味するため、合計平均が減少しない場合があります。サブセットからサブセットに移動すると、他の要素よりも小さくない要素を追加することを意味するため、合計平均が減少しない場合があります。from 1 to k
from 0 to k + 1
1 to k
0 to k + 1
k
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};
}