5429.数组中的k个最强值

image-20200607143951917

排序+哈希表

思路

  • 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;
}

参考链接:

断章:排序,选择最大的数字

posted @ 2020-06-07 14:56  YH_Simon  阅读(168)  评论(0编辑  收藏  举报