【LeetCode】Minimum Moves to Equal Array Elements 解題報告
標籤(空格分隔): LeetCode
[LeetCode]
https://leetcode.com/problems/minimum-moves-to-equal-array-elements/ Difficulty: Easy Question
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]
Ways
方法一:
我用的直接的方法,每次把數組排序,然後把前n-1個元素++,再排序,知道首尾元素相等即可。
根據測試案例,這個方法應該對的,但這個方法時間超出。
public class Solution { public int minMoves(int[] nums) { int count=0; Arrays.sort(nums); while(nums[0] != nums[nums.length-1]){ for(int i=0; i<nums.length-1; i++){ nums[i]++; } Arrays.sort(nums); count++; } return count; }}
方法二:
看了高票答案之後,才明白,把其中最小的n-1個元素都++ 相當於 把最大的元素–;
我們的目標是把所有的元素搞相等,也就是每次把最大的元素-1 直到所有元素都等於最小元素即可。
故總的運算次數等於 所有元素與最小元素 的差 的和: sum(array) - n * minimum
public class Solution { public int minMoves(int[] nums) { int count=0; int min=nums[0]; for(int num : nums){ min=Math.min(min,num); } for(int num : nums){ count += num - min; } return count; }}
AC: 14 ms
方法三:
受到上面的想法的啟發,反思方法一,沒必要每次迴圈都排下序,按照相減的策略,排序後,第一個元素就是最小元素,再求出其他元素與最小元素的差的和即可。
排序演算法的時間複雜度是O(nlog(n))
public class Solution { public int minMoves(int[] nums) { int count=0; Arrays.sort(nums); for(int num : nums){ count += num - nums[0]; } return count; }}
AC:53 ms
官網給的解答很好,很全面而且配了視頻。好評。https://leetcode.com/articles/minimum-moves-to-equal-array-elements/ Date
2017 年 1 月 7 日