標籤: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