原文链接: https://leetcode-cn.com/problems/design-movie-rental-system
英文原文
You have a movie renting company consisting of n
shops. You want to implement a renting system that supports searching for, booking, and returning movies. The system should also support generating a report of the currently rented movies.
Each movie is given as a 2D integer array entries
where entries[i] = [shopi, moviei, pricei]
indicates that there is a copy of movie moviei
at shop shopi
with a rental price of pricei
. Each shop carries at most one copy of a movie moviei
.
The system should support the following functions:
- Search: Finds the cheapest 5 shops that have an unrented copy of a given movie. The shops should be sorted by price in ascending order, and in case of a tie, the one with the smaller
shopi
should appear first. If there are less than 5 matching shops, then all of them should be returned. If no shop has an unrented copy, then an empty list should be returned. - Rent: Rents an unrented copy of a given movie from a given shop.
- Drop: Drops off a previously rented copy of a given movie at a given shop.
- Report: Returns the cheapest 5 rented movies (possibly of the same movie ID) as a 2D list
res
whereres[j] = [shopj, moviej]
describes that thejth
cheapest rented moviemoviej
was rented from the shopshopj
. The movies inres
should be sorted by price in ascending order, and in case of a tie, the one with the smallershopj
should appear first, and if there is still tie, the one with the smallermoviej
should appear first. If there are fewer than 5 rented movies, then all of them should be returned. If no movies are currently being rented, then an empty list should be returned.
Implement the MovieRentingSystem
class:
MovieRentingSystem(int n, int[][] entries)
Initializes theMovieRentingSystem
object withn
shops and the movies inentries
.List<Integer> search(int movie)
Returns a list of shops that have an unrented copy of the givenmovie
as described above.void rent(int shop, int movie)
Rents the givenmovie
from the givenshop
.void drop(int shop, int movie)
Drops off a previously rentedmovie
at the givenshop
.List<List<Integer>> report()
Returns a list of cheapest rented movies as described above.
Note: The test cases will be generated such that rent
will only be called if the shop has an unrented copy of the movie, and drop
will only be called if the shop had previously rented out the movie.
Example 1:
Input ["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]] Output [null, [1, 0, 2], null, null, [[0, 1], [1, 2]], null, [0, 1]] Explanation 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); // return [1, 0, 2], Movies of ID 1 are unrented at shops 1, 0, and 2. Shop 1 is cheapest; shop 0 and 2 are the same price, so order by shop number. movieRentingSystem.rent(0, 1); // Rent movie 1 from shop 0. Unrented movies at shop 0 are now [2,3]. movieRentingSystem.rent(1, 2); // Rent movie 2 from shop 1. Unrented movies at shop 1 are now [1]. movieRentingSystem.report(); // return [[0, 1], [1, 2]]. Movie 1 from shop 0 is cheapest, followed by movie 2 from shop 1. movieRentingSystem.drop(1, 2); // Drop off movie 2 at shop 1. Unrented movies at shop 1 are now [1,2]. movieRentingSystem.search(2); // return [0, 1]. Movies of ID 2 are unrented at shops 0 and 1. Shop 0 is cheapest, followed by shop 1.
Constraints:
1 <= n <= 3 * 105
1 <= entries.length <= 105
0 <= shopi < n
1 <= moviei, pricei <= 104
- Each shop carries at most one copy of a movie
moviei
. - At most
105
calls in total will be made tosearch
,rent
,drop
andreport
.
中文题目
你有一个电影租借公司和 n
个电影商店。你想要实现一个电影租借系统,它支持查询、预订和返还电影的操作。同时系统还能生成一份当前被借出电影的报告。
所有电影用二维整数数组 entries
表示,其中 entries[i] = [shopi, moviei, pricei]
表示商店 shopi
有一份电影 moviei
的拷贝,租借价格为 pricei
。每个商店有 至多一份 编号为 moviei
的电影拷贝。
系统需要支持以下操作:
- Search:找到拥有指定电影且 未借出 的商店中 最便宜的 5 个 。商店需要按照 价格 升序排序,如果价格相同,则
shopi
较小 的商店排在前面。如果查询结果少于 5 个商店,则将它们全部返回。如果查询结果没有任何商店,则返回空列表。 - Rent:从指定商店借出指定电影,题目保证指定电影在指定商店 未借出 。
- Drop:在指定商店返还 之前已借出 的指定电影。
- Report:返回 最便宜的 5 部已借出电影 (可能有重复的电影 ID),将结果用二维列表
res
返回,其中res[j] = [shopj, moviej]
表示第j
便宜的已借出电影是从商店shopj
借出的电影moviej
。res
中的电影需要按 价格 升序排序;如果价格相同,则shopj
较小 的排在前面;如果仍然相同,则moviej
较小 的排在前面。如果当前借出的电影小于 5 部,则将它们全部返回。如果当前没有借出电影,则返回一个空的列表。
请你实现 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()
如上所述,返回最便宜的 已借出 电影列表。
注意:测试数据保证 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 。现在商店 0 未借出电影编号为 [2,3] 。 movieRentingSystem.rent(1, 2); // 从商店 1 借出电影 2 。现在商店 1 未借出的电影编号为 [1] 。 movieRentingSystem.report(); // 返回 [[0, 1], [1, 2]] 。商店 0 借出的电影 1 最便宜,然后是商店 1 借出的电影 2 。 movieRentingSystem.drop(1, 2); // 在商店 1 返还电影 2 。现在商店 1 未借出的电影编号为 [1,2] 。 movieRentingSystem.search(2); // 返回 [0, 1] 。商店 0 和 1 有未借出的 ID 为 2 的电影。商店 0 最便宜,然后是商店 1 。
提示:
1 <= n <= 3 * 105
1 <= entries.length <= 105
0 <= shopi < n
1 <= moviei, pricei <= 104
- 每个商店 至多 有一份电影
moviei
的拷贝。 search
,rent
,drop
和report
的调用 总共 不超过105
次。
通过代码
高赞题解
class MovieRentingSystem {
public:
set<pair<int, int>> mv[100001];
set<pair<int, pair<int, int>>> rt;
map<pair<int, int>, int> prc;
MovieRentingSystem(int n, vector<vector<int>>& entries) {
for (size_t i = 0; i < entries.size(); i++) {
int x=entries[i][0], y=entries[i][1], z=entries[i][2];
prc[make_pair(x, y)] = z;
mv[y].insert(make_pair(z, x));
}
}
vector<int> search(int movie) {
auto it = mv[movie].begin(); vector<int> v;
for (size_t i=0; i<5 && it!=mv[movie].end(); i++,it++) v.push_back(it -> second);
return v;
}
void rent(int shop, int movie) {
int price = prc[make_pair(shop, movie)];
mv[movie].erase(make_pair(price, shop));
rt.insert(make_pair(price, make_pair(shop, movie)));
}
void drop(int shop, int movie) {
int price = prc[make_pair(shop, movie)];
mv[movie].insert(make_pair(price, shop));
rt.erase(make_pair(price, make_pair(shop, movie)));
}
vector<vector<int>> report() {
auto it = rt.begin(); vector<vector<int>> v;
for (size_t i=0; i<5 && it!=rt.end(); i++,it++) v.push_back({(it->second).first, (it->second).second});
return v;
}
};
统计信息
通过次数 | 提交次数 | AC比率 |
---|---|---|
1916 | 7577 | 25.3% |
提交历史
提交时间 | 提交结果 | 执行时间 | 内存消耗 | 语言 |
---|