LeetCode Minimum Moves to Equal Array Elements

來源:互聯網
上載者:User

標籤:lex   mini   for   each   .com   etc   find   output   size   

原題連結在這裡:https://leetcode.com/problems/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:3Explanation:Only three moves are needed (remember each move increments two elements):[1,2,3]  =>  [2,3,3]  =>  [3,4,3]  =>  [4,4,4]

題解:

Sort後, nums[0]是最小值, nums[nums.length-1]就是最大值. 若想最小值增加到最大值就需要做nums[nums.length-1] - nums[0] 次move.

之後nums[nums.length-2]就變成了最大值, nums[0], nums[nums.length-1]相等,都是最小值. 若想最小值增加到最大值需要nums[nums.length-2] - nums[0]次move.

以此類推,moves的總數等於(num[nums.length-1] - nums[0]) + (nums[nums.length-2] - nums[0]) + .... + (nums[1] - nums[0]).

Time Complexity: O(nlogn). Space: O(1).

AC Java:

 1 public class Solution { 2     public int minMoves(int[] nums) { 3         Arrays.sort(nums); 4         int move = 0; 5         for(int i = nums.length-1; i>0; i--){ 6             move += (nums[i]-nums[0]); 7         } 8         return move; 9     }10 }

DP, sort 之後把原問題拆成小問題. 當nums 的0到i-1位置都已經equal之後,加上新的 i 位置時,只需要做diff = num[i] - nums[i-1]次move就可以全部equal.

當然前面0到i-1的過程中nums[i]早已經加過了,增加的值 等於 前面0到i-1所做的moves總數.

nums[i] += moves成了新的nums[i], nums[i] - nums[i-1]就是這一步需要的move次數.

Time Complexity: O(nlogn). Space: O(1).

AC Java:

 1 public class Solution { 2     public int minMoves(int[] nums) { 3         Arrays.sort(nums); 4         int moves = 0; 5         for(int i = 1; i<nums.length; i++){ 6             nums[i] += moves; 7             moves += (nums[i] - nums[i-1]); 8         } 9         return moves;10     }11 }

數學方法,每次對n-1個element加一 等同於 對 1個element減一。

Time Complexity: O(n). Space: O(1).

AC Java:

 1 public class Solution { 2     public int minMoves(int[] nums) { 3         int min = Integer.MAX_VALUE; 4         for(int num : nums){ 5             min = Math.min(min, num); 6         } 7          8         int moves = 0; 9         for(int num: nums){10             moves += (num - min);11         }12         return moves;13     }14 }

 

LeetCode Minimum Moves to Equal Array Elements

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.