1. 程式人生 > >LeetCode#453 最小移動次數使數組元素相等

LeetCode#453 最小移動次數使數組元素相等

0ms 在線 import leet except else can sta system

給定一個長度為 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 }

抽自己幾個耳刮子才行?!!



LeetCode#453 最小移動次數使數組元素相等