美文网首页
求输入元素中的前K大元素

求输入元素中的前K大元素

作者: 光影墨辰 | 来源:发表于2017-09-19 16:40 被阅读0次

思路:

始终维持一个K个元素的最小堆,对输入的前K个元素,先构成一个K个元素的最小堆,然后对后面输入的每个元素,先和堆顶a[0]比较,若小于等于a[0],则不做处理,否则,将当前输入的元素赋值给a[0],然后将其下浮到合适的位置。

import java.util.ArrayList;
import java.util.Arrays;

public class zuidadui {
    public static void main(String[] args){
        int aim[] = {1, 2, 5, 10, 3, 7, 11, 15, 17, 20, 9, 15, 8, 16};
        int len = aim.length;
        int haipa[] = new int[len],q=0;
        for(int p:aim){
            haipa[q++] = (-1)*p;
        }
        int K = 5;
        Arrays.sort(haipa);
        Show(haipa);
        
        build_min_dui(aim,K); //通过上浮的方法构建K个元素的最小堆
        Show(aim);
        for(int j = K;j<len;j++) { //对从 K+1 到元素末尾  ,插入最小堆
      //若要插入的元素比堆顶元素小或相等,则不处理,否则将其付给堆顶元素,并将其下沉到合适位置。
            if(aim[j] > aim[0]){
                down(aim, K, j);    
            }
        }
        Show(aim);
    }
    
    public static void build_min_dui(int a[],int K){
        for(int i = 1;i< K;i++){
            up_floor(a, i);
        }
    }
    public static void down(int a[],int K,int cur) {
        a[0] = a[cur];
         cur = 0;
        while(cur < K){
            int child = 2*cur + 1;
            if(child >= K)break;
            else{
                if(child < K -1 && a[child] >a[child +1]){
                    child++;
                }
                if(a[cur]>a[child]){
                    int tempt = a[child];
                    a[child] = a[cur];
                    a[cur] = tempt;
                    cur = child;
                }else
                    break;
            }
            
        }
    }
    
    public static void up_floor(int a[],int flag){
        int tt;
        if(flag > 0){
            int par = (flag - 1)/2;
            if(a[par] > a[flag]) {
                tt = a[flag];
                a[flag] = a[par];
                a[par] = tt;
                up_floor(a, par);
            }
        }
    }
    
    public static void Show(int a[]){
        for(int i : a){
            System.out.print(i + " ");
        }
        System.out.println();
    }
}

相关文章

  • 求输入元素中的前K大元素

    思路: 始终维持一个K个元素的最小堆,对输入的前K个元素,先构成一个K个元素的最小堆,然后对后面输入的每个元素,先...

  • PriorityQueue 使用方法

    求最大k个元素的问题:使用小顶堆 求最小k个元素的问题:使用大顶堆 参考:1 采用PriorityQueue实现大...

  • Day75: 前 K 个高频元素

    Day75: 前 K 个高频元素 给定一个非空的整数数组,返回其中出现频率前 k 高的元素。 示例 1: 输入: ...

  • 应用: 排序,从小到大用最大堆,从大到小用最小堆 选出元素中的 top k 个top k 个最小数:数组前k个元素...

  • LeetCode 347 前 K 个高频元素

    347. 前 K 个高频元素 这次是求前K个高频元素,同理,用堆其实最好解决,具体的步骤是:1.先建立一个hash...

  • 解决TopK

    前言 TopK问题有以下几种常见形式 数组中的第K个最大元素动态添加的数组中的第K个最大元素数组中前k个最大的元素...

  • 堆--Top K

    求数组中前k大的数据思路:维护一个数据大小为k的小顶堆,循环遍历数组,如果比堆顶元素大,我们就把堆顶元素删除,并且...

  • 查找第 K 大的数

    题目 查找无序整数数组中第 K 大的元素。 示例 输入:[1, 0, 5, -1, 3, 2, 4], 3 输出:...

  • 每天一道leetcode347-前K个高频元素

    347_(前K个高频元素)Top K Frequent Element 1 问题描述、输入输出与样例 1.1 问题...

  • TopK问题(快排变形/优先级队列)

    1.数组中第k大/前k大的元素(215-中) 示例: 思路: 法1:快排变形:类似传统快排,区别在于,我们每次进行...

网友评论

      本文标题:求输入元素中的前K大元素

      本文链接:https://www.haomeiwen.com/subject/awxgsxtx.html