Cruise Ship Treasure Hunt - codepath/compsci_guides GitHub Wiki
Unit 7 Session 2 (Click for link to problem statements)
Problem Highlights
- 💡 Difficulty: Medium
- ⏰ Time to complete: 20 mins
- 🛠️ Topics: Divide and Conquer, Matrix Search
1: U-nderstand
Understand what the interviewer is asking for by using test cases and questions about the problem.
- Q: What should be returned if the
treasure
is not found in the matrix?- A: Return
(-1, -1)
since the treasure is not in the matrix.
- A: Return
- Q: Are the room numbers unique in the matrix?
- A: Yes, the problem assumes that all room numbers are unique.
- Q: Is the matrix always sorted row-wise and column-wise?
- A: Yes, both rows and columns are sorted in ascending order.
HAPPY CASE
Input: rooms = [
[1, 4, 7, 11],
[8, 9, 10, 20],
[11, 12, 17, 30],
[18, 21, 23, 40]
], treasure = 17
Output: (2, 2)
Explanation: The treasure is found at row 2, column 2.
Input: rooms = [
[1, 4, 7, 11],
[8, 9, 10, 20],
[11, 12, 17, 30],
[18, 21, 23, 40]
], treasure = 5
Output: (-1, -1)
Explanation: The treasure is not found in the matrix.
EDGE CASE
Input: rooms = [], treasure = 10
Output: (-1, -1)
Explanation: The matrix is empty, so return (-1, -1).
Input: rooms = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
], treasure = 7
Output: (2, 0)
Explanation: The treasure is found at row 2, column 0.
2: M-atch
Match what this problem looks like to known categories of problems, e.g., Linked List or Dynamic Programming, and strategies or patterns in those categories.
For problems involving searching in a sorted matrix, we can consider the following approaches:
- Divide and Conquer: Use a divide-and-conquer approach to narrow down the search area within the matrix.
- Greedy Search: A greedy approach can be used by starting from the top-right corner and iteratively narrowing down the search based on the value comparison.
3: P-lan
Plan the solution with appropriate visualizations and pseudocode.
Plan
- Start from the Top-Right Corner: Begin the search from the top-right corner of the matrix.
- Compare Values:
- If the current value equals the treasure, return its coordinates.
- If the current value is greater than the treasure, move left to a smaller column.
- If the current value is less than the treasure, move down to a larger row.
- Terminate: The loop terminates when the treasure is found or when the indices go out of bounds.
Greedy Search Implementation
Pseudocode:
1) Check if the matrix is empty. If true, return (-1, -1).
2) Initialize `row` to 0 and `col` to `len(matrix[0]) - 1`.
3) While `row` is within bounds and `col` is non-negative:
a) If `matrix[row][col] == treasure`, return `(row, col)`.
b) If `matrix[row][col] > treasure`, decrement `col`.
c) If `matrix[row][col] < treasure`, increment `row`.
4) If the loop ends without finding the treasure, return (-1, -1).
4: I-mplement
Implement the code to solve the algorithm.
def find_treasure(matrix, treasure):
if not matrix:
return (-1, -1)
rows = len(matrix)
cols = len(matrix[0])
row = 0
col = cols - 1
# Start from the top-right corner
while row < rows and col >= 0:
if matrix[row][col] == treasure:
return (row, col)
elif matrix[row][col] > treasure:
col -= 1 # Move left
else:
row += 1 # Move down
return (-1, -1) # Treasure not found
5: R-eview
Review the code by running specific example(s) and recording values (watchlist) of your code's variables along the way.
- Trace through your code with the input
rooms = [1, 4, 7, 11], [8, 9, 10, 20], [11, 12, 17, 30], [18, 21, 23, 40](/codepath/compsci_guides/wiki/1,-4,-7,-11],-[8,-9,-10,-20],-[11,-12,-17,-30],-[18,-21,-23,-40)
andtreasure = 17
:- The search should correctly identify the coordinates
(2, 2)
as the location of the treasure.
- The search should correctly identify the coordinates
6: E-valuate
Evaluate the performance of your algorithm and state any strong/weak or future potential work.
Assume M
represents the number of rows and N
represents the number of columns in the matrix.
- Time Complexity:
O(M + N)
because the algorithm may traverse the entire top row and rightmost column in the worst case. - Space Complexity:
O(1)
as the space used is constant regardless of input size.