• Leetcode 347 前K个高频元素 topK问题手写大顶堆


      JAVA:

    public final int[] topKFrequent(int[] nums, int k) {
            Item[] arr = this.initItemArr(nums);
            HeapSort heap = new HeapSort(arr);
            int[] reArr = new int[k];
            for (int i = 0; i < k; i++) reArr[i] = heap.getHead().getVal();
            return reArr;
        }
    
        private final Item[] initItemArr(int[] nums) {
            Map<Integer, Item> map = new HashMap<Integer, Item>();
            for (int i = 0; i < nums.length; i++) {
                int val = nums[i];
                if (!map.containsKey(val)) map.put(val, new Item(val, 0));
                Item item = map.get(val);
                item.setNum(item.getNum() + 1);
            }
            Item[] arr = new Item[map.keySet().size()];
            Iterator<Integer> itemIterator = map.keySet().iterator();
            int i = 0;
            while (itemIterator.hasNext()) {
                arr[i] = map.get(itemIterator.next());
                i++;
            }
            return arr;
        }
    
    
        private class Item {
            private int val;
            private int num;
    
            Item(int val, int num) {
                this.val = val;
                this.num = num;
            }
    
            public int getVal() {
                return val;
            }
    
            public void setVal(int val) {
                this.val = val;
            }
    
            public int getNum() {
                return num;
            }
    
            public void setNum(int num) {
                this.num = num;
            }
        }
    
        private class HeapSort {
            HeapSort(Item[] arr) {
                this.arr = arr;
                this.len = arr.length;
                for (int i = len - 1; i >= 0; i--) this.sort(arr, i);
            }
    
            Item[] arr;
            int len;
    
            public Item getHead() {
                if (this.len == 0) return null;
                Item ans = this.arr[0];
                this.arr[0] = null;
                this.exchange(this.arr, 0, this.len - 1);
                this.len--;
                this.sort(arr, 0);
                return ans;
            }
    
            private final void sort(Item[] arr, int point) {
                Item root = arr[point];
                if (root == null) return;
                int leftPoint = point * 2 + 1, rightPoint = point * 2 + 2, len = arr.length;
                int max = root.getNum(), next = point;
                if (leftPoint < this.len && arr[leftPoint].getNum() > max) {
                    max = arr[leftPoint].getNum();
                    next = leftPoint;
                }
                if (rightPoint < this.len && arr[rightPoint].getNum() > max) {
                    max = arr[rightPoint].getNum();
                    next = rightPoint;
                }
                if (next != point) {
                    this.exchange(arr, point, next);
                    this.sort(arr, next);
                }
            }
    
            private final void exchange(Item[] arr, int point0, int point1) {
                Item temp = arr[point0];
                arr[point0] = arr[point1];
                arr[point1] = temp;
            }
        }

      JS:

    /**
     * @param {number[]} nums
     * @param {number} k
     * @return {number[]}
     */
    var topKFrequent = function (nums, k) {
        let arr = initArr(nums), heap = new HeapSort(arr), ans = [];
        for (let i = 0; i < k; i++) ans.push(heap.getHead().val);
        return ans;
    };
    
    var initArr = function (arr) {
        let map = new Map();
        for (let i = 0; i < arr.length; i++) {
            if (!map.get(arr[i])) map.set(arr[i], new Item(arr[i], 0));
            map.get(arr[i]).num = map.get(arr[i]).num + 1;
        }
        let ans = [];
        map.forEach(function (value, key) {
            ans.push(value);
        });
        return ans;
    }
    
    var HeapSort = function (arr) {
        if (!arr || arr.length == 0) throw new Error("arr is null!");
        this.arr = arr;
        this.len = arr.length;
    
        this.getHead = function () {
            if (this.len == 0) throw new Error("out of arr index!");
            let head = this.arr[0];
            this.arr[0] = null;
            this.exchange(0, this.len - 1);
            this.len--;
            this.sort(0);
            return head;
        }
    
        this.sort = function (point) {
            if (point >= this.len) return;
            let root = this.arr[point];
            if (!root) return;
            let leftPoint = 2 * point + 1, rightPoint = 2 * point + 2;
            let max = root.num, nextPoint = point;
            if (leftPoint < this.len && this.arr[leftPoint].num > max) {
                max = this.arr[leftPoint].num;
                nextPoint = leftPoint;
            }
            if (rightPoint < this.len && this.arr[rightPoint].num > max) {
                max = this.arr[rightPoint].num;
                nextPoint = rightPoint;
            }
            if (nextPoint != point) {
                this.exchange(point, nextPoint);
                this.sort(nextPoint);
            }
        }
    
        this.exchange = function (point0, point1) {
            let temp = this.arr[point0];
            this.arr[point0] = this.arr[point1];
            this.arr[point1] = temp;
        }
    
        for (let i = this.len - 1; i >= 0; i--) this.sort(i);
    }
    
    var Item = function (val, num) {
        this.val = val;
        this.num = num;
    }

    当你看清人们的真相,于是你知道了,你可以忍受孤独
  • 相关阅读:
    decode(解码)与encode(编码)——python
    Appium环境准备(二)
    cannot bind to 127.0.0.1:5037解决方法
    使用adb命令获取包名
    cookie的弊端
    jquery点击弹出一个页面+点击X可关闭的部分
    实现AJAX的异步交互的步骤
    HTML5,jQuery,ajax基础面试
    js 基础面试题
    JavaScript,DOM经典基础面试题
  • 原文地址:https://www.cnblogs.com/niuyourou/p/15241711.html
Copyright © 2020-2023  润新知