题目描述
对于一个无序数组,数组中元素为互不相同的整数,请返回其中最小的k个数,顺序与原数组中元素顺序一致。
给定一个整数数组A及它的大小n,同时给定k,请返回其中最小的k个数。
测试样例:
[1,2,4,3],4,2
返回:[1,2]
y用Collections.sort和Comparator去做即可。
这里对HashMap的键值对排序,因为hashMap中装的是EnteySet<K,V>对象,所以Comparator排序的是EnteySet<K,V>对象,这里要把map中的enteyset对象存到arraylist中进行比较,所以其实还是转换成arraylist的比较。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class KthNumbers {
public int[] findKthNumbers(int[] A, int n, int k) {
// write code here
int[] min = new int[k];
if(A==null||A.length==0)return min;
HashMap<Integer, Integer> map = new HashMap<>();
HashMap<Integer, Integer> list = new HashMap<>();
for (int i = 0; i < n; i++) {
map.put(A[i], i);
}
Arrays.sort(A);
for (int i = 0; i <k; i++) {
list.put(A[i], map.get(A[i]));
}
ArrayList<Entry<Integer, Integer>> arrayList = new ArrayList<Map.Entry<Integer, Integer>>(list.entrySet());
Collections.sort(arrayList,new Comparator<Map.Entry<Integer, Integer>>() {
@Override
public int compare(Entry<Integer, Integer> o1, Entry<Integer, Integer> o2) {
return o1.getValue()-o2.getValue();
}
});
int i = 0;
for (Entry<Integer, Integer> entry : arrayList) {
min[i] = entry.getKey();i++;
}
return min;
}
}
看了一下别人的思路,发现有更简洁的方法:
import java.util.*;
public class KthNumbers {
public int[] findKthNumbers(int[] A, int n, int k) {
// write code here
int[] min = new int[k];
int[] copy = Arrays.copyOfRange(A, 0, A.length);
Arrays.sort(copy);
int s = copy[k-1];
int j = 0;
for (int i = 0; i < n; i++) {
if(A[i]<=s&&j<k) {
min[j]=A[i];
j++;
}
}
return min;
}
}