5429.数组中的k个最强值
排序+哈希表
思路
Arrays.sort()
对数组排序- 以
与中位数差值的绝对值
为Key
,以记录所有对应的num
的集合为Value
,构造Map<Integer,List<Integer>>
类型的map
,用TreeMap
实现(默认以key升序) - 将
map
降序,遍历map
代码
//200ms
public static int[] getStrongest(int[] arr, int k) {
int len=arr.length;
int[] ans=new int[k];
Arrays.sort(arr);
int mid=arr[(len-1)/2];
Map<Integer,List<Integer>> map= new TreeMap<>();
//遍历 记录
for(int num:arr){
int tmp=Math.abs(num-mid);
if(map.containsKey(tmp)){
map.get(tmp).add(num);
}else{
List<Integer> list=new ArrayList<>();
list.add(num);
map.put(tmp, list);
}
}
//降序
map=((TreeMap)map).descendingMap();
System.out.println(map.toString());
int count=0;
boolean flag=false;
for(Map.Entry<Integer,List<Integer>> entry:map.entrySet()){
List<Integer> list=entry.getValue();
Collections.sort(list);
for(int i=list.size()-1;i>=0;i--){
if (count == k) {
flag=true;
break;
}
ans[count++]=list.get(i);
}
if(flag){
break;
}
}
System.out.println(Arrays.toString(ans));
return ans;
}
排序+双指针
代码
//45ms
public static int[] getStrongest2(int[] arr,int k){
if(arr.length<=1||k>arr.length) return arr;
Arrays.sort(arr);
int mid=arr[(arr.length-1)/2];
//定义左、右指针 count计数
int l=0,r=arr.length-1,count=0;
int[] ans=new int[k];
while (count<k){
if(Math.abs(arr[r]-mid)>=Math.abs(arr[l]-mid)){
ans[count++]=arr[r];
r--;//右指针左移
}else{
ans[count++]=arr[l];
l++;//左指针右移
}
}
return ans;
}
参考链接: