leetcode刷題之堆

2021-10-04 03:53:26 字數 2582 閱讀 3032

今天終於開啟的第二個專題的刷題之旅堆,不過第乙個專題棧還有乙個小問題沒解決就是利用遞減棧去解決接雨水的問題,雖然那道題我用動態規劃的問題解決出來了,我記得看到過一道面試題,問棧和堆有什麼區別。通過搜尋網上的資料總結如下。

棧(stack)由系統分配記憶體,速度較快,但是自己無法掌握。

堆:一般用兩種方法來申請記憶體。new和malloc 我們自己申請出來的記憶體,相對於棧來說速度較慢,但是使用起來比較方便。

堆主要由大頂堆和小頂堆,其分布結構類似於二叉搜尋樹,又和二叉搜尋樹有所不同,大頂堆父節點大於其子結點(左右)即使遞減排列的。小頂堆和大頂堆相反,按照公升序排列。構建大小頂堆的時候一般要和優先佇列結合起來定義其形式如下

priority_queue

其中type為資料型別,container是容器的型別,需要注意的是container必須用陣列去實現。比如vector、deque等但是不能用list 

functional就是比較方式

關於優先佇列的講解與實現,這是一篇十分好的文章。

這是個比較簡單的題目,其實這道題最容易想到的就是我們排序之後,返回nums[nums.size()-k],但是複雜度要比用堆解決高些。用小頂堆去解決leetcode上官方題解是正確的但是在講解過程說的是大頂堆其實是錯的。我們通常用小頂堆去尋找最大值,因為小頂堆的堆頂存放的是最小元素,在向堆插入元素是按照遞增的順序插入的,因此求第k個最大元素,直接讓堆中有k個元素,堆頂即是第k個最大值,因為堆中始終存放的是前k個最大值。堆頂又是最小的。有了這道題作為鋪墊,下面的那一道題相對容易一些。

解法如下,思路比較簡單,就是通過建立雜湊表 來統計元素出現的頻率,利用小頂堆來記錄k個出現頻率最高的元素。如果新的元素出現的次數大於堆頂元素則將該元素入堆否則不做處理。稍微有點難度的地方在於構建小頂堆的時候需要過載類函式。**如下

class solution 

}; vectortopkfrequent(vector& nums, int k)

priority_queue,cmp> s;//構建小頂堆 精髓在於 vectorfor(auto item:hash)// 將雜湊表和小堆頂結合

有了上面兩個題的鋪墊這個題可以直接想到用小頂堆來存放資料,存完之後把小頂堆的資料逐一取出。涉及到鍊錶的操作。

鍊錶的操作待學習和記錄

這道題我一開始的想法就是暴力解法很容易想到,就是把元素逐個後移,和當前元素的後兩個值進行比較,儲存結果,**如下

class solution 

if (k == 1)//長度為1,就是自身

for(int i=0;i<=nums.size()-k;i++)

if (k == 1)//長度為1,就是自身

dequemaxque;

maxque.push_back(nums[0]);

int maxk = nums[0];

for (int i = 1; i < k; i++)

if (maxk < nums[i])

while (!maxque.empty() && nums[i] > maxque.back())//從尾部開始把每個小於nums[i]的數去除。

maxque.push_back(nums[i]);

}res.push_back(maxk);//第乙個視窗的最大值

for (int i = k; i < nums.size(); i++)

while (!maxque.empty() && nums[i] > maxque.back())//從尾部開始把每個小於nums[i]的數去除。

maxque.push_back(nums[i]);

res.push_back(maxque.front());

}return res;}};

LeetCode刷題(七) 堆

根據堆的性質之一 堆中某個節點的值總是不大於或不小於其父節點的值,可以將堆分為大根堆 最大堆 與小根堆 最小堆 將根節點最大的堆叫做最大堆或大根堆,根節點最小的堆叫做最小堆或小根堆。注 堆的根節點中存放的是最大或者最小元素,但是其他節點的排序順序是未知的。假設現在有乙個小根堆,並且根的元素名為roo...

Leetcode刷題之括號

給定乙個只包括 的字串,判斷字串是否有效。有效字串需滿足 左括號必須用相同型別的右括號閉合。左括號必須以正確的順序閉合。注意空字串可被認為是有效字串。示例 1 輸入 輸出 true 示例 2 輸入 輸出 true 示例 3 輸入 輸出 false 示例 4 輸入 輸出 false 示例 5 輸入 輸...

leetcode刷題之樹

樹的三種遍歷方式 的 非遞迴版本 中序遍歷 下面的解法就是相當於 第一趟先把元素按照中序的順序進棧 第二趟 是相當於把 null標記過的位置給拿出來 class solution else return res 先序遍歷 class solution else return res 公共父節點 pu...