zoukankan      html  css  js  c++  java
  • 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;
    }
    

    参考链接:

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

  • 相关阅读:
    Luogu P1020 导弹拦截
    洛谷 p1196 带权并查集
    gradle 语法基础
    Codeforces Round #542 div.2 C
    我了解的字符编码
    洛谷p3374 树状数组1
    树状数组2
    线段树模板 求区间和, 区间加法,乘法更新
    洛谷 p1886 滑动窗口
    HDOJ.1251
  • 原文地址:https://www.cnblogs.com/yh-simon/p/13060609.html
Copyright © 2011-2022 走看看