LeetCode算法題-Kth Largest Element in a Stream(Java實現)

這是悅樂書的第296次更新,第315篇原創

01 看題和準備

今天介紹的是LeetCode算法題中Easy級別的第164題(順位題號是703)。設計一個類來查找流中第k個最大元素。請注意,它是排序順序中的第k個最大元素,而不是第k個不同元素。KthLargest類有一個構造方法,此構造方法有一個整數k和一個整數數組nums兩個參數,它包含來自流的初始元素。對於方法KthLargest.add的每次調用,返回表示流中第k個最大元素的元素。例如:

int k = 3;

int [] arr = [4,5,8,2];

KthLargest kthLargest = new KthLargest(3,arr);

kthLargest.add(3); //返回4

kthLargest.add(5); //返回5

kthLargest.add(10); //返回5

kthLargest.add(9); //返回8

kthLargest.add(4); //返回8

注意:nums的長度大於等於0。

本次解題使用的開發工具是eclipse,jdk使用的版本是1.8,環境是win7 64位系統,使用Java語言編寫和測試。

02 第一種解法

直接解法。使用數組,在add方法裏,首先將原數組擴容,將新的元素添加進數組中去,再對數組排序,然後取出倒數第k個元素。期間,藉助工具類Arrays來實現數組擴容和排序。

class KthLargest {
    int k;
    int[] nums;
    public KthLargest(int k, int[] nums) {
        this.k = k;
        this.nums = nums;
    }

    public int add(int val) {
        int[] temp = Arrays.copyOf(nums, nums.length+1);
        temp[temp.length-1] = val;
        Arrays.sort(temp);
        nums = temp;
        return temp[nums.length-k];
    }
}

/**
 * Your KthLargest object will be instantiated and called as such:
 * KthLargest obj = new KthLargest(k, nums);
 * int param_1 = obj.add(val);
 */


03 第二種解法

使用優先隊列。優先隊列自帶排序算法,在初始化時如果不指定排序方式,則默認以自然方式排序,優先隊列的頭就會是以自然排序爲基礎的最小元素。因此,我們可以在初始化優先隊列時,就指定其大小爲k,然後找出最大的前k個元素存入優先隊列,每次調用add方法時,就比較傳參val和隊列頭的大小,如果val比隊列頭大,就移除原隊列頭,將val作爲新的隊列頭。

class KthLargest {
    int k;
    PriorityQueue<Integer> q;
    public KthLargest(int k, int[] nums) {
        this.k = k;
        q = new PriorityQueue<Integer>(k);
        for (int n : nums) {
            add(n);
        }
    }

    public int add(int val) {
        if (q.size() < k) {
            q.offer(val);
        } else if (q.peek() < val) {
            q.poll();
            q.offer(val);
        }
        return q.peek();
    }
}

/**
 * Your KthLargest object will be instantiated and called as such:
 * KthLargest obj = new KthLargest(k, nums);
 * int param_1 = obj.add(val);
 */


04 小結

算法專題目前已日更超過四個月,算法題文章164+篇,公衆號對話框回覆【數據結構與算法】、【算法】、【數據結構】中的任一關鍵詞,獲取系列文章合集。

以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支持!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章