代碼隨想錄算法訓(xùn)練營第十三天-創(chuàng)新互聯(lián)

LeetCode 239. 滑動窗口大值

10年積累的網(wǎng)站建設(shè)、成都做網(wǎng)站經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先建設(shè)網(wǎng)站后付款的網(wǎng)站建設(shè)流程,更有建德免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

題目描述:給你一個整數(shù)數(shù)組 nums,有一個大小為?k?的滑動窗口從數(shù)組的最左側(cè)移動到數(shù)組的最右側(cè)。你只可以看到在滑動窗口內(nèi)的 k?個數(shù)字?;瑒哟翱诿看沃幌蛴乙苿右晃?。返回 滑動窗口中的大值 。


視頻講解https://www.bilibili.com/video/BV1XS4y1p7qj/?vd_source=f98f2942b3c4cafea8907a325fc56a48文章講解https://programmercarl.com/0239.%E6%BB%91%E5%8A%A8%E7%AA%97%E5%8F%A3%E6%9C%80%E5%A4%A7%E5%80%BC.html

  • 思路:不必維護窗口里的所有元素,只需要維護有可能成為窗口里大值的元素就可以了
    • 單調(diào)隊列:用 deque 維護一個隊首→隊尾,單調(diào)遞減的隊列 que
      • void pop(int val):如果 val 為大值,彈出隊首元素,即 que.pop_front()
      • void push(int val):
        • que 中的元素都比 val 早進入滑動窗口,也早離開滑動窗口,故而只需維護大于 val 的值,比 val 小的值是沒有機會成為滑動窗口大值的
        • while (隊尾元素
        • 將 val 插入到隊尾
      • int getMax():返回隊首元素
    • i< k,只 push(nums[i])
    • 添加 [0, k - 1] 大值到 result
    • i 從 k 向后遍歷,先 pop(nums[i - k]),再 push(nums[i]),最后添加滑動窗口 [ i - k + 1, i] 的大值(直接調(diào)用 getMax)到 result
  • 代碼:
class Solution {
private:
    // 單調(diào)隊列(從大到小)
    class MyQueue {
    public:
        // 用deque來實現(xiàn)
        dequeque;
        // 每次彈出的時候,比較當(dāng)前要彈出的數(shù)值是否等于隊列出口元素的數(shù)值,如果相等則彈出。
        // 同時pop之前判斷隊列當(dāng)前是否為空。
        void pop(int val) {
            if (!que.empty() && val == que.front()) {
                que.pop_front();
            }
        }
        // 如果push的數(shù)值大于入口元素的數(shù)值,那么就將隊列后端的數(shù)值彈出,直到push的數(shù)值小于等于隊列入口元素的數(shù)值為止。
        // 這樣就保持了隊列里的數(shù)值是單調(diào)從大到小的了。
        void push(int val) {
            while (!que.empty() && que.back()< val ) {
                que.pop_back();
            }
            que.push_back(val);
        }
        // 查詢當(dāng)前隊列里的大值 直接返回隊列前端也就是front就可以了。
        int getMax() {
            return que.front();
        }
    };
public:
    vectormaxSlidingWindow(vector& nums, int k) {
        MyQueue que;
        // 滑動窗口大值序列
        vectorresult;
        // 先將前k的元素放進隊列
        for (int i = 0; i< k; ++i) {
            que.push(nums[i]);
        }
        result.push_back(que.getMax());
        // 移動滑動窗口
        for (int i = k; i< nums.size(); ++i) {
            que.pop(nums[i - k]);
            que.push(nums[i]);
            result.push_back(que.getMax());
        }
        return result;
    }
};

LeetCode 347.前 K 個高頻元素

題目描述:給定一個非空的整數(shù)數(shù)組 nums,返回其中出現(xiàn)頻率前 k 高的元素。

視頻講解https://www.bilibili.com/video/BV1Xg41167Lz文章講解https://programmercarl.com/0347.%E5%89%8DK%E4%B8%AA%E9%AB%98%E9%A2%91%E5%85%83%E7%B4%A0.html

  • 思路:
    • 統(tǒng)計 {元素值, 出現(xiàn)次數(shù)}:不需要按key值排序,unordered_map即可
    • 排序,維護出現(xiàn)次數(shù)前k大的(用小頂堆,頻率低的優(yōu)先級高)
    • 需要自定義比較規(guī)則,可以參考下這篇文章:c++優(yōu)先隊列(priority_queue)用法詳解
    • 注意:優(yōu)先隊列中存儲的是pair,而最后結(jié)果只需要key
  • 代碼:
// 時間復(fù)雜度:O(nlogk)
// 空間復(fù)雜度:O(n)
class Solution {
public:
    // 小頂堆
    class mycomparison {
    public:
        bool operator()(const pair& lhs, const pair& rhs) {
            // 頻率低的優(yōu)先級高
            return lhs.second >rhs.second;
        }
    };
    vectortopKFrequent(vector& nums, int k) {
        // 要統(tǒng)計元素出現(xiàn)頻率
        unordered_mapmap; // mapfor (int i = 0; i< nums.size(); i++) {
            map[nums[i]]++;
        }

        // 對頻率排序
        // 定義一個小頂堆,大小為k
        priority_queue, vector>, mycomparison>pri_que;

        // 用固定大小為k的小頂堆,掃面所有頻率的數(shù)值
        for (unordered_map::iterator it = map.begin(); it != map.end(); it++) {
            pri_que.push(*it);
            if (pri_que.size() >k) { // 如果堆的大小大于了K,則隊列彈出,保證堆的大小一直為k
                pri_que.pop();
            }
        }

        // 找出前K個高頻元素,因為小頂堆先彈出的是最小的,所以倒序來輸出到數(shù)組
        vectorresult(k);
        for (int i = k - 1; i >= 0; i--) {
            result[i] = pri_que.top().first;
            pri_que.pop();
        }
        return result;

    }
};

總結(jié)

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧

分享題目:代碼隨想錄算法訓(xùn)練營第十三天-創(chuàng)新互聯(lián)
新聞來源:http://muchs.cn/article48/dgcchp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)全網(wǎng)營銷推廣、搜索引擎優(yōu)化網(wǎng)站營銷、品牌網(wǎng)站設(shè)計、定制網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)