LeetCode#453 最小移動次數使數組元素相等
阿新 • • 發佈:2018-08-26
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 最小移動次數使數組元素相等