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

    参考链接:

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

  • 相关阅读:
    GitLab 介绍
    git 标签
    git 分支
    git 仓库 撤销提交 git reset and 查看本地历史操作 git reflog
    git 仓库 回退功能 git checkout
    python 并发编程 多进程 练习题
    git 命令 查看历史提交 git log
    git 命令 git diff 查看 Git 区域文件的具体改动
    POJ 2608
    POJ 2610
  • 原文地址:https://www.cnblogs.com/yh-simon/p/13060609.html
Copyright © 2011-2022 走看看