首页 > 代码库 > LeetCode Minimum Moves to Equal Array Elements
LeetCode Minimum Moves to Equal Array Elements
原题链接在这里: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: 3 Explanation: 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