日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 1172. 餐盘栈(栈 + set)

發(fā)布時間:2024/7/5 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 1172. 餐盘栈(栈 + set) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1. 題目

我們把無限數(shù)量 ∞ 的棧排成一行,按從左到右的次序從 0 開始編號。每個棧的的最大容量 capacity 都相同。

實現(xiàn)一個叫「餐盤」的類 DinnerPlates:

  • DinnerPlates(int capacity) - 給出棧的最大容量 capacity。
  • void push(int val) - 將給出的正整數(shù) val 推入 從左往右第一個 沒有滿的棧。
  • int pop() - 返回 從右往左第一個 非空棧頂部的值,并將其從棧中刪除;如果所有的棧都是空的,請返回 -1。
  • int popAtStack(int index) - 返回編號 index 的棧頂部的值,并將其從棧中刪除;如果編號 index 的棧是空的,請返回 -1。
示例: 輸入: ["DinnerPlates","push","push","push","push","push","popAtStack","push","push", "popAtStack","popAtStack","pop","pop","pop","pop","pop"] [[2],[1],[2],[3],[4],[5],[0],[20],[21],[0],[2],[],[],[],[],[]] 輸出: [null,null,null,null,null,null,2,null,null,20,21,5,4,3,1,-1]解釋: DinnerPlates D = DinnerPlates(2); // 初始化,棧最大容量 capacity = 2 D.push(1); D.push(2); D.push(3); D.push(4); D.push(5); // 棧的現(xiàn)狀為: 2 41 3 5? ? ? D.popAtStack(0); // 返回 2。棧的現(xiàn)狀為: 41 3 5? ? ? D.push(20); // 棧的現(xiàn)狀為: 20 41 3 5? ? ? D.push(21); // 棧的現(xiàn)狀為: 20 4 211 3 5? ? ? D.popAtStack(0); // 返回 20。棧的現(xiàn)狀為: 4 211 3 5? ? ? D.popAtStack(2); // 返回 21。棧的現(xiàn)狀為: 41 3 5? ? ? D.pop() // 返回 5。棧的現(xiàn)狀為: 41 3 ? ? D.pop() // 返回 4。棧的現(xiàn)狀為: 1 3 ? ? D.pop() // 返回 3。棧的現(xiàn)狀為: 1 ? D.pop() // 返回 1。現(xiàn)在沒有棧。 D.pop() // 返回 -1。仍然沒有棧。提示: 1 <= capacity <= 20000 1 <= val <= 20000 0 <= index <= 100000 最多會對 push,pop,和 popAtStack 進行 200000 次調(diào)用。

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/dinner-plate-stacks
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。

2. 解題

  • 暴力法,按題意進行逐個搜索,超時
class STK//自定義棧 { public:int size;int capacity;vector<int> data;STK(int cap):size(0), capacity(cap) { data.resize(cap);}bool isEmpty() const { return size == 0;}bool isFull() const { return capacity == size;}void push(int val){if(!isFull())data[size++] = val;}int pop(){if(isEmpty())return -1;return data[--size];} }; class DinnerPlates {int cap;vector<STK> v; public:DinnerPlates(int capacity) {cap = capacity;}void push(int val) {int i = 0;while(i < v.size() && v[i].isFull())i++;if(i < v.size())v[i].push(val);else{v.push_back(STK(cap));v[i].push(val);}}int pop() {int i = v.size()-1;while(i >= 0 && v[i].isEmpty())i--;if(i < 0)return -1;int tp = v[i].pop();return tp;}int popAtStack(int index) {if(v.empty() || index >= v.size())return -1;return v[index].pop();} };

  • 改進:增加兩個set , set 有序
set<int> s1;//存儲沒有滿的棧的id set<int> s2;//存儲不為空的棧的id
  • s1 的 begin() 就是可以 push 的 id
  • s2 的 end()-- 就是可以 pop 的 id,記得同時維護這兩個 set
class STK//自定義棧 { public:int size;int capacity;vector<int> data;STK(int cap):size(0), capacity(cap) { data.resize(cap);}bool isEmpty() const { return size == 0;}bool isFull() const { return capacity == size;}void push(int val){if(!isFull())data[size++] = val;}int pop(){if(isEmpty())return -1;return data[--size];} }; class DinnerPlates {int cap;vector<STK> v;set<int> s1;//存儲沒有滿的棧的idset<int> s2;//存儲不為空的棧的idint tp; public:DinnerPlates(int capacity) {cap = capacity;}void push(int val) {if(!s1.empty()){v[*s1.begin()].push(val);s2.insert(*s1.begin());if(v[*s1.begin()].isFull())s1.erase(s1.begin());}else//所有的棧都滿了{v.push_back(STK(cap));v[v.size()-1].push(val);s2.insert(v.size()-1);if(cap != 1)s1.insert(v.size()-1);}}int pop() {if(s2.empty())//棧全部為空return -1;tp = v[*(--s2.end())].pop();s1.insert(*(--s2.end()));if(v[*(--s2.end())].isEmpty())s2.erase(*(--s2.end()));return tp;}int popAtStack(int index) {if(v.empty() || index >= v.size())return -1;tp = v[index].pop();if(v[index].isEmpty())s2.erase(index);s1.insert(index);return tp;} };

總結(jié)

以上是生活随笔為你收集整理的LeetCode 1172. 餐盘栈(栈 + set)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。