Leetcode 之 Minimum Moves to Equal Array Elements II
2016-12-15 14:27
330 查看
题目描述:
Given a non-empty integer array, find the minimum number of moves required to make all array elements equal, where a move is incrementing a selected element by 1 or decrementing a selected element by 1.
You may assume the array’s length is at most 10,000.
Example:
Input:
[1,2,3]
Output:
2
Explanation:
Only two moves are needed (remember each move increments or decrements one element):
[1,2,3] => [2,2,3] => [2,2,2]
思路就是先排序,找到中位数,然后遍历,每个值都往中位数靠。
一开始想追求时间复杂度O(n),但是输入为{203125577,-349566234,230332704,48321315,66379082,386516853,50986744,-250908656,-425653504,-212123143};的时候由于空间复杂度太高没通过,然后就换成O(nlogn)的QuickRank算法尝试了一下,通过了。
代码如下:
Given a non-empty integer array, find the minimum number of moves required to make all array elements equal, where a move is incrementing a selected element by 1 or decrementing a selected element by 1.
You may assume the array’s length is at most 10,000.
Example:
Input:
[1,2,3]
Output:
2
Explanation:
Only two moves are needed (remember each move increments or decrements one element):
[1,2,3] => [2,2,3] => [2,2,2]
思路就是先排序,找到中位数,然后遍历,每个值都往中位数靠。
一开始想追求时间复杂度O(n),但是输入为{203125577,-349566234,230332704,48321315,66379082,386516853,50986744,-250908656,-425653504,-212123143};的时候由于空间复杂度太高没通过,然后就换成O(nlogn)的QuickRank算法尝试了一下,通过了。
代码如下:
public class Solution { public int minMoves2(int[] nums) { ArrayList<Integer>numList=new ArrayList<Integer>(),l; for(int n:nums)numList.add(n); l=(ArrayList<Integer>) quickRank(numList); int middle=l.get(l.size()/2),times=0; for(int n:l){ times+=Math.abs(n-middle); } return times; } //以下是排序算法 复杂度为O(n log n) public List<Integer>quickRank(List<Integer>nums){ List<Integer>ranked=new ArrayList<Integer>(); int len=nums.size(),middle=len/2; if(len<=1)return nums; List<Integer>left=new ArrayList<Integer>(),right=new ArrayList<Integer>(); int middleNum=nums.get(middle); for(int i=0;i<len;i++){ if(i!=middle){ if (middleNum>=nums.get(i))left.add(nums.get(i)); else right.add(nums.get(i)); } } left=quickRank(left); right=quickRank(right); for(int l:left)ranked.add(l); ranked.add(middleNum); for(int r:right)ranked.add(r); return ranked; } }
相关文章推荐
- 【LeetCode-462】Minimum Moves to Equal Array Elements II
- LeetCode Minimum Moves to Equal Array Elements II
- [LeetCode] Minimum Moves to Equal Array Elements II 最少移动次数使数组元素相等之二
- [LeetCode]Minimum Moves to Equal Array Elements II(Java)
- Leetcode 462 Minimum Moves to Equal Array Elements II
- Leetcode 462 Minimum Moves to Equal Array Elements II
- [leetcode462] Minimum Moves to Equal Array Elements II
- [leetcode][462] Minimum Moves to Equal Array Elements II
- LeetCode: Minimum Moves to Equal Array Elements II
- leetcode 462 Minimum Moves to Equal Array Elements II C++
- Leetcode-462 Minimum Moves to Equal Array Elements II
- Leetcode: Minimum Moves to Equal Array Elements II
- LeetCode 462 Minimum Moves to Equal Array Elements II (中位数)
- 【leetcode】462. Minimum Moves to Equal Array Elements II【M】
- leetcode Minimum Moves to Equal Array Elements
- Leetcode 462. Minimum Moves to Equal Array Elements II 使数组相等 解题报告
- [leetcode 453]Minimum Moves to Equal Array Elements
- [LeetCode] Minimum Moves to Equal Array Elements 最少移动次数使数组元素相等
- LeetCode "Minimum Moves to Equal Array Elements"
- Minimum Moves to Equal Array Elements II