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.IOException;
 2 import java.util.Scanner;
 3
 4
 5 public class MainClass {
 6     public static void main(String[] args) throws IOException{
 7         Scanner input = new Scanner(System.in);
 8         System.out.println("请输入数组,元素间以逗号隔开:");
 9         int[] nums=stringToArray(input.nextLine());
10         Solution getMoves=new Solution();
11         int moves=getMoves.minMoves(nums);
12         System.out.println("最少移动次数为:");
13         System.out.println(moves);
14     }
15     public static int[] stringToArray(String str){
16         String[] strArr= str.split(",");
17         int[] arr=new int[strArr.length];
18         for(int i=0;i<strArr.length;i++){
19             arr[i]=Integer.parseInt(strArr[i].trim());
20         }
21         return arr;
22     }
23 }
24
25 class Solution {
26     public int minMoves(int[] nums) {
27         int minMoves=move(nums,0);
28
29         return minMoves;
30     }
31
32     public int[] subMaxMin(int[] nums){
33         int max=0,min=0;
34         for(int i=1;i<nums.length;i++){
35             if(nums[max]<nums[i]){
36                 max=i;
37             }
38             if(nums[min]>nums[i]){
39                 min=i;
40             }
41         }
42         int[] maxAndMin={max,min};
43         return maxAndMin;
44     }
45
46     public int move(int[] nums,int sumMove){
47         int[] maxAndMin=subMaxMin(nums);
48         int moves=nums[maxAndMin[0]]-nums[maxAndMin[1]];
49         if(moves!=0){
50             sumMove+=moves;
51             for(int i=0;i<nums.length;i++){
52                 if(i!=maxAndMin[0]){
53                     nums[i]+=moves;
54                 }
55             }
56             return move(nums,sumMove);
57         }else{
58             return sumMove;
59         }
60     }
61 }

本实现在leetcode提交后,因为超时,被拒,虽然在myeclipes中可以快速运行,但在线调试显示发费时间极高,[1,2,3]花费时间在120ms左右。
百度后发现: 本算法的核心是移动次数是数组内其他元素减去最小值的和,所以。。。。

 1 class Solution {
 2     public int minMoves(int[] nums) {
 3         int sum=0,moves,min=nums[0];
 4         for(int i=0;i<nums.length;i++){
 5             sum+=nums[i];
 6             if(nums[i]<min){
 7                 min=nums[i];
 8             }
 9         }
10         moves=sum-min*nums.length;
11         return moves;
12     }
13 }

抽自己几个耳刮子才行?!!




原文地址:https://www.cnblogs.com/mudaoyuye/p/9538222.html

时间: 2024-11-07 10:28:35

LeetCode#453 最小移动次数使数组元素相等的相关文章

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

题意:一次操作,n元数组中任意n-1个数+1.求取最小操作次数使得数组所有元素相等. 分析: 1.正面思考,每次将数组中除最大值以外的所有值+1,直到所有元素都相等. 2.反面思考,每次将数组中的最大值-1,直到所有元素相等(最少操作次数=数组和-n*数组最小值) n元数组,其中n-1元+1,因为只要求元素相等,可以不考虑值,可以整体再-1,两次操作后也就是一元-1. 反面思考数学证明: 假设所有元素都相等时数字为k, 如果最小数字经过x次移动能够等于k, 则此时所有元素也能等于k, 此时移动次

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 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 简单】 第一百零三题 最小移动次数使数组元素相等

给定一个长度为 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】

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

[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

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

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