您的位置:首页 > 其它

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算法尝试了一下,通过了。

代码如下:

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