當Rust遇上LeetCode #面試題59. 隊列的最大值 II [中等]

2020/3/7

題目描述

請定義一個隊列并實現(xiàn)函數(shù) max_value 得到隊列里的最大值,要求函數(shù)max_value、push_back 和 pop_front 的均攤時間復雜度都是O(1)。

若隊列為空,pop_front 和 max_value 需要返回 -1

示例

示例 1:

輸入:
["MaxQueue","push_back","push_back","max_value","pop_front","max_value"]
[[],[1],[2],[],[],[]]
輸出: [null,null,null,2,1,2]

示例 2:

輸入:
["MaxQueue","pop_front","max_value"]
[[],[],[]]
輸出: [null,-1,-1]

相關標簽


Sliding window

解題思路

  • 算法:
    基本思路是可以通過同時維護一個 雙端隊列 deque 和一個 單向隊列 queue 來以O(1)的時間獲取隊列中的最大值。
    其中,queue 用來保存正常的值,而 deque 用于保存隊列中的最大值。每次push一個新的值時val,需要將 deque 中所有小于 val 的值全部 pop,從而保證 deque 中保存的值一定滿足單調(diào)。

  • 復雜度分析:
    時間復雜度:O(1)(插入,刪除,求最大值)
    刪除操作于求最大值操作顯然只需要 O(1) 的時間。而插入操作雖然看起來有循環(huán),做一個插入操作時最多可能會有 nn 次出隊操作。但要注意,由于每個數(shù)字只會出隊一次,因此對于所有的 n 個數(shù)字的插入過程,對應的所有出隊操作也不會大于 n 次。因此將出隊的時間均攤到每個插入操作上,時間復雜度為 O(1)O(1)。
    空間復雜度:O(n),需要用隊列存儲所有插入的元素。

源代碼

use std::collections::VecDeque;

struct MaxQueue {
    queue: VecDeque<i32>,
    deque: VecDeque<i32>,
}


/**
 * `&self` means the method takes an immutable reference.
 * If you need a mutable reference, change it to `&mut self` instead.
 */
impl MaxQueue {

    fn new() -> Self {
        MaxQueue {
            queue: VecDeque::new(),
            deque: VecDeque::new(),
        }
    }
    
    fn max_value(&self) -> i32 {
        match self.deque.front() {
            Some(front) => *front,
            None => -1,
        }
    }
    
    fn push_back(&mut self, value: i32) {
        while let Some(back) = self.deque.back() {
            if *back < value {
                self.deque.pop_back();
            }
            else {
                break;
            }
        }
        self.deque.push_back(value);
        self.queue.push_back(value);
    }
    
    fn pop_front(&mut self) -> i32 {
        match self.queue.front() {            
            Some(front) => {
                if *front == *self.deque.front().unwrap() {
                    self.deque.pop_front();
                }
                self.queue.pop_front().unwrap()
            },
            None => -1,
        }
    }
}

/**
 * Your MaxQueue object will be instantiated and called as such:
 * let obj = MaxQueue::new();
 * let ret_1: i32 = obj.max_value();
 * obj.push_back(value);
 * let ret_3: i32 = obj.pop_front();
 */

執(zhí)行用時 : 32 ms, 在所有 Rust 提交中擊敗了100.00%的用戶
內(nèi)存消耗 : 4.3 MB, 在所有 Rust 提交中擊敗了100.00%的用戶

總結(jié)

Rust中的隊列相關數(shù)據(jù)結(jié)構都可以通過對 VecDeque 進行封裝來實現(xiàn)。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 題目 請定義一個隊列并實現(xiàn)函數(shù) max_value 得到隊列里的最大值,要求函數(shù)max_value、push_ba...
    倚劍賞雪閱讀 245評論 0 0
  • STL部分 1.STL為什么廣泛被使用 C++ STL 之所以得到廣泛的贊譽,也被很多人使用,不只是提供了像vec...
    杰倫哎呦哎呦閱讀 4,466評論 0 9
  • 容器的概念所謂STL容器,即是將最常運用的一些數(shù)據(jù)結(jié)構(data structures)實現(xiàn)出來。容器是指容納特定...
    飯飯H閱讀 443評論 0 0
  • 考點:本題考查隊列和知識遷移能力 題目一描述:滑動窗口的最大值 給定一個數(shù)組和滑動窗口的大小,找出所有滑動窗口里數(shù)...
    今天柚稚了么閱讀 226評論 0 0
  • 1.雙端隊列介紹 雙端隊列(dequeue) 與vector很類似,采用線性表順序存儲結(jié)構,且支持隨機訪問,即可以...
    ebayboy閱讀 11,365評論 0 0

友情鏈接更多精彩內(nèi)容