Stealth Interview
  • Features
  • Pricing
  • Blog
  • Login
  • Sign up

Leetcode #1912: Design Movie Rental System

In this guide, we solve Leetcode #1912 Design Movie Rental System in Python and focus on the core idea that makes the solution efficient.

You will see the intuition, the step-by-step method, and a clean Python implementation you can use in interviews.

Leetcode

Problem Statement

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.

Quick Facts

  • Difficulty: Hard
  • Premium: No
  • Tags: Design, Array, Hash Table, Ordered Set, Heap (Priority Queue)

Intuition

Fast membership checks and value lookups are the heart of this problem, which makes a hash map the natural choice.

By storing what we have already seen (or counts/indexes), we can answer the question in one pass without backtracking.

Approach

Scan the input once, using the map to detect when the condition is satisfied and to update state as you go.

This keeps the solution linear while remaining easy to explain in an interview setting.

Steps:

  • Initialize a hash map for seen items or counts.
  • Iterate through the input, querying/updating the map.
  • Return the first valid result or the final computed value.

Example

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.

Python Solution

class MovieRentingSystem: def __init__(self, n: int, entries: List[List[int]]): self.available = defaultdict(lambda: SortedList()) self.price_map = {} for shop, movie, price in entries: self.available[movie].add((price, shop)) self.price_map[self.f(shop, movie)] = price self.rented = SortedList() def search(self, movie: int) -> List[int]: return [shop for _, shop in self.available[movie][:5]] def rent(self, shop: int, movie: int) -> None: price = self.price_map[self.f(shop, movie)] self.available[movie].remove((price, shop)) self.rented.add((price, shop, movie)) def drop(self, shop: int, movie: int) -> None: price = self.price_map[self.f(shop, movie)] self.rented.remove((price, shop, movie)) self.available[movie].add((price, shop)) def report(self) -> List[List[int]]: return [[shop, movie] for _, shop, movie in self.rented[:5]] def f(self, shop: int, movie: int) -> int: return shop << 30 | movie # Your MovieRentingSystem object will be instantiated and called as such: # obj = MovieRentingSystem(n, entries) # param_1 = obj.search(movie) # obj.rent(shop,movie) # obj.drop(shop,movie) # param_4 = obj.report()

Complexity

The time complexity is O(mlog⁡m)O(m \log m)O(mlogm), where mmm is the length of entries\text{entries}entries. The space complexity is O(m)O(m)O(m), where mmm is the length of entries\text{entries}entries.

Edge Cases and Pitfalls

Watch for boundary values, empty inputs, and duplicate values where applicable. If the problem involves ordering or constraints, confirm the invariant is preserved at every step.

Summary

This Python solution focuses on the essential structure of the problem and keeps the implementation interview-friendly while meeting the constraints.


Ace your next coding interview

We're here to help you ace your next coding interview.

Subscribe
Stealth Interview
© 2026 Stealth Interview®Stealth Interview is a registered trademark. All rights reserved.
Product
  • Blog
  • Pricing
Company
  • Terms of Service
  • Privacy Policy