[Leetcode学习-c++&java] Minimum Operations to Make Array Equal(单数数组平均值)

46 篇文章 0 订阅

问题:

难度: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 是一个等差,所以公式是 \sum_{0}^{n}n\left \{ n >= 0 \right \}=\frac{(n + 1)*n}{2}

3、如果单独求单数的和,那么就是\sum_{0}^{n}(2 * (n-1) + 1) \left \{ n >= 0 \right \} =\frac{(2*n)*(2*n-1)}{2},双数类推

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);
    }
};

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值