问题:
难度:medium
说明:
给出一个数字,比如 3,然后就列举一个单数的数组:[1 , 3 , 5]
开始进行操作,可以选择两个元素,让其中一个 + 1 另一个就要 - 1,那么让这个单数数组的所有元素值都一样需要多少次这样的操作
题目连接:https://leetcode.com/problems/minimum-operations-to-make-array-equal/
输入案例:
Example 1:
Input: n = 3
Output: 2
Explanation: arr = [1, 3, 5]
First operation choose x = 2 and y = 0, this leads arr to be [2, 3, 4]
In the second operation choose x = 2 and y = 0 again, thus arr = [3, 3, 3].
Example 2:
Input: n = 6
Output: 9
我的代码:
水题,其实就做个数学题,要让单数数组的所有元素都一样,那么就是把所有元素都弄成平均值。
弄成平均值的话,单数的计算公式是:
1、1 + 3 + 5 可以认为是 (1 + 2 + 3 + 4 + 5 + 6) - (2 + 4 + 6) = (1 + 2 + 3 + 4 + 5 + 6) - (1 + 3 + 5 + 1 + 1 + 1)
2、1 + 2 + 3 + 4 + 5 + 6 是一个等差,所以公式是
3、如果单独求单数的和,那么就是,双数类推
4、然后区分的是集合里面元素数量,如果是单数集合,比如 5 个 [1 3 5 7 9] ,平均值是5,那么就有 [4 2 0 2 4] 的距离,而操作只需要 2 + 4 就可以了,相当于是 双数的求和(和单数作类比),如果是双数集合,比如6个 [1 3 5 7 9 11] 那么平均数是 6 距离为 [5 3 1 1 3 5],那么就是 1 + 3 + 5,是单数的求和公式
所以巴拉巴拉最后就这样:
Java:
class Solution {
public int minOperations(int n) {
return (n & 1) == 0 ? (((n + 1) * n >> 1) - (n >> 1) >> 1) : (((n - 1) * n >> 1) - (n >> 1) >> 1) + (n >> 1);
}
}
C++:
class Solution {
public:
int minOperations(int n) {
return (n & 1) == 0 ? (((n + 1) * n >> 1) - (n >> 1) >> 1) : (((n - 1) * n >> 1) - (n >> 1) >> 1) + (n >> 1);
}
};