453. 最小移动次数使数组元素相等(数学)

题意:一次操作,n元数组中任意n-1个数+1。求取最小操作次数使得数组所有元素相等。

分析:

1.正面思考,每次将数组中除最大值以外的所有值+1,直到所有元素都相等。

2.反面思考,每次将数组中的最大值-1,直到所有元素相等(最少操作次数=数组和-n*数组最小值)

n元数组,其中n-1元+1,因为只要求元素相等,可以不考虑值,可以整体再-1,两次操作后也就是一元-1。

反面思考数学证明:

假设所有元素都相等时数字为k, 如果最小数字经过x次移动能够等于k, 则此时所有元素也能等于k, 此时移动次数为k-min(nums).
则有方程: 数组元素总和增加量 = 终止时数组元素总和 - 开始时数组元素总和
即方程: (k-min(nums)) * (n-1) = k * n - sum(nums)
求解后: k = sum(nums) - min(nums) * (n-1)
则可以得到最小移动次数  k-min(nums)

 1 class Solution {
 2     public int minMoves(int[] nums) {
 3         if(nums==null) return 0;
 4         int min=Integer.MAX_VALUE,sum=0;
 5         for(int num:nums){
 6             sum+=num;
 7             if(min>num) min=num;
 8         }
 9         return sum-nums.length*min;
10     }
11 }

原文地址:https://www.cnblogs.com/NiBosS/p/12080284.html

时间: 2024-08-29 12:41:35

453. 最小移动次数使数组元素相等(数学)的相关文章

LeetCode#453 最小移动次数使数组元素相等

给定一个长度为 n 的非空整数数组,找到让数组所有元素相等的最小移动次数.每次移动可以使 n - 1 个元素增加 1. 示例: 输入: [1,2,3] 输出: 3 解释: 只需要3次移动(注意每次移动会增加两个元素的值): [1,2,3] => [2,3,3] => [3,4,3] => [4,4,4] 自我思考:观察规律,移动次数是数组内最大值减去最小值,然后生成新数组后继续用最大值减最小值,直到这个差为0,每次的差的和就是移动次数代码实现如下 1 import java.io.IOE

453. 最小移动次数使数组元素相等

给定一个长度为 n 的非空整数数组,找到让数组所有元素相等的最小移动次数.每次移动可以使 n - 1 个元素增加 1. 示例: 输入: [1,2,3] 输出: 3 解释: 只需要3次移动(注意每次移动会增加两个元素的值): [1,2,3] => [2,3,3] => [3,4,3] => [4,4,4] 思路: 设加x次,加到最后,每个数都为y sum:数组元素的和 min:数组中最小的元素 n:数组中元素的个数 则有: sum+(n-1)*x = n*y(式1) y = min+x(式

【leetcode 简单】 第一百零三题 最小移动次数使数组元素相等

给定一个长度为 n 的非空整数数组,找到让数组所有元素相等的最小移动次数.每次移动可以使 n - 1 个元素增加 1. 示例: 输入: [1,2,3] 输出: 3 解释: 只需要3次移动(注意每次移动会增加两个元素的值): [1,2,3] => [2,3,3] => [3,4,3] => [4,4,4] class Solution: def minMoves(self, nums): """ :type nums: List[int] :rtype: in

(Java) LeetCode 453. Minimum Moves to Equal Array Elements —— 最小移动次数使数组元素相等

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: 3 Explanation: Only three moves are needed (remem

Leetcode 462.最少移动次数使数组元素相等

最少移动次数使数组元素相等 给定一个非空整数数组,找到使所有数组元素相等所需的最小移动数,其中每次移动可将选定的一个元素加1或减1. 您可以假设数组的长度最多为10000. 例如: 输入: [1,2,3] 输出: 2 说明: 只有两个动作是必要的(记得每一步仅可使其中一个元素加1或减1): [1,2,3] => [2,2,3] => [2,2,2] 排序之后,从两边往中间走,最大和最小之间的差距,是一定要填补上的,不管+1 还是 -1,所以最后都等于中位数. 1 import java.uti

[LeetCode] Minimum Moves to Equal Array Elements 最少移动次数使数组元素相等

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: 3 Explanation: Only three moves are needed (remem

Leetcode-462 Minimum Moves to Equal Array Elements II(最少移动次数使数组元素相等 II)

1 class Solution 2 { 3 public: 4 int minMoves2(vector<int>& nums) 5 { 6 sort(nums.begin(),nums.end(),less<int>()); 7 int result = 0; 8 if((nums.size()&0x1)==1) 9 { 10 for(auto d:nums) 11 result += abs(d-nums[nums.size()/2]); 12 } 13 el

LeetCode:最少移动次数使得数组元素相等||【462】

LeetCode:最少移动次数使得数组元素相等||[462] 题目描述 给定一个非空整数数组,找到使所有数组元素相等所需的最小移动数,其中每次移动可将选定的一个元素加1或减1. 您可以假设数组的长度最多为10000. 例如: 输入: [1,2,3] 输出: 2 说明: 只有两个动作是必要的(记得每一步仅可使其中一个元素加1或减1): [1,2,3] => [2,2,3] => [2,2,2] 题目分析 一个直观的理解是这样的,如果我们只有两个数字的话,那么我们使得他们变成相等元素的最少步数是多

程序员面试题目总结--数组(三)【旋转数组的最小数字、旋转数组中查找指定数、两个排序数组所有元素中间值、数组中重复次数最多的数、数组中出现次数超过一半的数】

转!http://blog.csdn.net/dabusideqiang/article/details/38271661 11.求旋转数组的最小数字 题目:输入一个排好序的数组的一个旋转,输出旋转数组的最小元素. 分析:数组的旋转:把一个数组最开始的若干个元素搬到数组的末尾.例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1.这道题最直观的解法并不难.从头到尾遍历数组一次,就能找出最小的元素,时间复杂度显然是O(N).但这个思路没有利用输入数组