题意:
存在一个长度为 n 的数组 arr ,其中 arr[i] = (2 * i) + 1 ( 0 <= i < n )。
一次操作中,你可以选出两个下标,记作 x 和 y ( 0 <= x, y < n )并使 arr[x] 减去 1 、arr[y] 加上 1 (即 arr[x] -=1 且 arr[y] += 1 )。最终的目标是使数组中的所有元素都 相等 。题目测试用例将会 保证 :在执行若干步操作后,数组中的所有元素最终可以全部相等。
给你一个整数 n,即数组的长度。请你返回使数组 arr 中所有元素相等所需的 最小操作数 。
解题思路:
① 操作次数为前 int(n/2)个数与平均值 的差值和(直接for循环求)
② 列公式:分奇偶。
奇数情况下,操作次数为 n * n / 4 n-1 ... n - 3 ... n - 5 .... 1 前n/2项和
偶数情况下,操作次数为 (n * n - 1) / 4 n-1 ... n - 3 ... n - 5 .... 2 前(n-1)/2项和
class Solution {
/**
* @param Integer $n
* @return Integer
*/
function minOperations($n) {
if($n == 1){
return 0;
}
if($n % 2 == 0){
return ($n/2) * ($n/2);
} else {
return (($n-1)/2) * (($n-1)/2+1); // 怕n*n溢出
}
}
}