LeetCode 1912. 设计电影租借系统(map+set)
文章目錄
- 1. 題目
- 2. 解題
1. 題目
你有一個電影租借公司和 n 個電影商店。
你想要實現(xiàn)一個電影租借系統(tǒng),它支持查詢、預訂和返還電影的操作。
同時系統(tǒng)還能生成一份當前被借出電影的報告。
所有電影用二維整數(shù)數(shù)組 entries 表示,其中 entries[i] = [shopi, moviei, pricei] 表示商店 shopi 有一份電影 moviei 的拷貝,租借價格為 pricei 。
每個商店有 至多一份 編號為 moviei 的電影拷貝。
系統(tǒng)需要支持以下操作:
- Search:找到擁有指定電影且 未借出 的商店中 最便宜的 5 個 。
商店需要按照 價格 升序排序,
如果價格相同,則 shopi 較小 的商店排在前面。
如果查詢結果少于 5 個商店,則將它們?nèi)糠祷亍?br /> 如果查詢結果沒有任何商店,則返回空列表。 - Rent:從指定商店借出指定電影,題目保證指定電影在指定商店 未借出 。
- Drop:在指定商店返還 之前已借出 的指定電影。
- Report:返回 最便宜的 5 部已借出電影 (可能有重復的電影 ID),將結果用二維列表 res 返回,
其中 res[j] = [shopj, moviej] 表示第 j 便宜的已借出電影是從商店 shopj 借出的電影 moviej 。
res 中的電影需要按 價格 升序排序;
如果價格相同,則 shopj 較小 的排在前面;
如果仍然相同,則 moviej 較小 的排在前面。
如果當前借出的電影小于 5 部,則將它們?nèi)糠祷亍?br /> 如果當前沒有借出電影,則返回一個空的列表。
請你實現(xiàn) MovieRentingSystem 類:
- MovieRentingSystem(int n, int[][] entries) 將 MovieRentingSystem 對象用 n 個商店和 entries 表示的電影列表初始化。
- List<Integer> search(int movie) 如上所述,返回 未借出 指定 movie 的商店列表。
- void rent(int shop, int movie) 從指定商店 shop 借出指定電影 movie 。
- void drop(int shop, int movie) 在指定商店 shop 返還之前借出的電影 movie 。
- List<List<Integer>> report() 如上所述,返回最便宜的 已借出 電影列表。
注意:測試數(shù)據(jù)保證 rent 操作中指定商店擁有 未借出 的指定電影,且 drop 操作指定的商店 之前已借出 指定電影。
示例 1: 輸入: ["MovieRentingSystem", "search", "rent", "rent", "report", "drop", "search"] [[3, [[0, 1, 5], [0, 2, 6], [0, 3, 7], [1, 1, 4], [1, 2, 7], [2, 1, 5]]], [1], [0, 1], [1, 2], [], [1, 2], [2]] 輸出: [null, [1, 0, 2], null, null, [[0, 1], [1, 2]], null, [0, 1]]解釋: MovieRentingSystem movieRentingSystem = new MovieRentingSystem(3, [[0, 1, 5], [0, 2, 6], [0, 3, 7], [1, 1, 4], [1, 2, 7], [2, 1, 5]]); movieRentingSystem.search(1); // 返回 [1, 0, 2] ,商店 1,0 和 2 有未借出的 ID 為 1 的電影。商店 1 最便宜,商店 0 和 2 價格相同,所以按商店編號排序。 movieRentingSystem.rent(0, 1); // 從商店 0 借出電影 1 。現(xiàn)在商店 0 未借出電影編號為 [2,3] 。 movieRentingSystem.rent(1, 2); // 從商店 1 借出電影 2 。現(xiàn)在商店 1 未借出的電影編號為 [1] 。 movieRentingSystem.report(); // 返回 [[0, 1], [1, 2]] 。商店 0 借出的電影 1 最便宜,然后是商店 1 借出的電影 2 。 movieRentingSystem.drop(1, 2); // 在商店 1 返還電影 2 。現(xiàn)在商店 1 未借出的電影編號為 [1,2] 。 movieRentingSystem.search(2); // 返回 [0, 1] 。商店 0 和 1 有未借出的 ID 為 2 的電影。商店 0 最便宜,然后是商店 1 。提示: 1 <= n <= 3 * 10^5 1 <= entries.length <= 10^5 0 <= shopi < n 1 <= moviei, pricei <= 10^4 每個商店 至多 有一份電影 moviei 的拷貝。 search,rent,drop 和 report 的調(diào)用 總共 不超過 10^5 次。來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/design-movie-rental-system
著作權歸領扣網(wǎng)絡所有。商業(yè)轉載請聯(lián)系官方授權,非商業(yè)轉載請注明出處。
2. 解題
class MovieRentingSystem {unordered_map<int, set<pair<int,int>>> unborrowed; //movie : <price, shop>set<vector<int>> borrowed; // <price, shop, movie>unordered_map<long long, int> m; // shop*k+movie, price, 根據(jù) shop,movie,獲取其 pricelong long k = 10001; public:MovieRentingSystem(int n, vector<vector<int>>& entries) {for(auto& e : entries){unborrowed[e[1]].insert({e[2], e[0]});m[e[0]*k+e[1]] = e[2];}}vector<int> search(int movie) {if(unborrowed.find(movie) == unborrowed.end())return {};auto it = unborrowed[movie].begin();int i = 0;vector<int> ans;while(i < 5 && it != unborrowed[movie].end()) // 未借出電影的最便宜的5家店{ans.push_back((*it).second);i++;it++;}return ans;}void rent(int shop, int movie) {int price = m[shop*k+movie];borrowed.insert({price, shop, movie});//借出unborrowed[movie].erase({price, shop});if(unborrowed[movie].empty())unborrowed.erase(movie);}void drop(int shop, int movie) {int price = m[shop*k+movie];borrowed.erase({price, shop, movie});unborrowed[movie].insert({price, shop});//歸還}vector<vector<int>> report() {auto it = borrowed.begin();int i = 0;vector<vector<int>> ans;while(i < 5 && it != borrowed.end())//借出里面最便宜的5本{ans.push_back({(*it)[1], (*it)[2]});i++;it++;}return ans;} };1268 ms 298.5 MB C++
我的CSDN博客地址 https://michael.blog.csdn.net/
長按或掃碼關注我的公眾號(Michael阿明),一起加油、一起學習進步!
總結
以上是生活随笔為你收集整理的LeetCode 1912. 设计电影租借系统(map+set)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 对象引用、可变性 和 垃圾
- 下一篇: LeetCode 1564. 把箱子放进