Minimum Moves to Equal Array Elements

来源:互联网 发布:linux spi驱动 编辑:程序博客网 时间:2024/06/05 09:26

题目:

Given a non-empty integer array of size n, find the minimum number of moves required to make all array elements equal, where a move is incrementing n - 1 elements by 1.

Example:

Input:[1,2,3]Output:3Explanation:Only three moves are needed (remember each move increments two elements):[1,2,3]  =>  [2,3,3]  =>  [3,4,3]  =>  [4,4,4]

解析:将一个数组所有数字变换成同一个数字,且每次只能将数组中元素个数减1个数字变换1,最后输出变换次数;

我们假设,变换之前数组和为sum,最后变换的次数为m,变换之后数组中元素都为x,数组元素为n,且数组未变换之前最小元素为minNum,则有

(1)sum+m*(n-1) = x*n;

(2)x = minNum+m;

由以上(1)(2),可得(3)sum-minNum*n = m;

Java代码实现如下(注意边界的处理):

import java.math.BigDecimal;
public class Solution {
    public int minMoves(int[] nums) {
        
         // 这道题看来很久,没有什么思路
         // 一般涉及数字的算法题,都是通过寻找相应的规律来解题
         // 这道题若只是找数字规律,好像很难找出数字规律
         // 通过列举数学方程,找出最后的输出结果与输入之间的关系
         if(nums==null){
             return 0; // 边界处理
         }
         int count = 0; // 没有变换之前数组所有元素总和
         int min = Integer.MAX_VALUE; // 没有变换之前数组中最小的元素
         
         for(int i=0;i<nums.length;i++){
             if(min>nums[i]){
                 min = nums[i];
             }
         }
         for(int i:nums){
             count += i;
         }
         return count-min*nums.length; // 由以上推出的结果输出
    }

总结:这道easy难度的算法题,只要有思路,解答并不难,但是对的思路怎么产生,就需要解题者有解题的经验。一般算法题,通过数字找规律,像这种通过数字不能一眼找出规律的算法题,要通过数据之间的关系,进行数据梳理,列出对应的公式,最后根据多个公式降次消元等推算出结果予以代码实现。