diff --git a/algorithms/002661-first-completely-painted-row-or-column/README.md b/algorithms/002661-first-completely-painted-row-or-column/README.md new file mode 100644 index 000000000..f53f78f9f --- /dev/null +++ b/algorithms/002661-first-completely-painted-row-or-column/README.md @@ -0,0 +1,138 @@ +2661\. First Completely Painted Row or Column + +**Difficulty:** Medium + +**Topics:** `Array`, `Hash Table`, `Matrix` + +You are given a **0-indexed** integer array `arr`, and an `m x n` integer **matrix** `mat`. `arr` and `mat` both contain **all** the integers in the range `[1, m * n]`. + +Go through each index `i` in `arr` starting from index `0` and paint the cell in `mat` containing the integer `arr[i]`. + +Return _the smallest index `i` at which either a row or a column will be completely painted in `mat`_. + +**Example 1:** + +![grid1](https://assets.leetcode.com/uploads/2023/01/18/grid1.jpg) + +- **Input:** arr = [1,3,4,2], mat = [[1,4],[2,3]] +- **Output:** 2 +- **Explanation:** The moves are shown in order, and both the first row and second column of the matrix become fully painted at `arr[2]`. + +**Example 2:** + +![grid2](https://assets.leetcode.com/uploads/2023/01/18/grid2.jpg) + +- **Input:** arr = [2,8,7,4,1,3,5,6,9], mat = [[3,2,5],[1,4,6],[8,7,9]] +- **Output:** 3 +- **Explanation:** The second column becomes fully painted at `arr[3]`. + + + +**Constraints:** + +- `m == mat.length` +- `n = mat[i].length` +- `arr.length == m * n` +- 1 <= m, n <= 105 +- 1 <= m * n <= 105 +- `1 <= arr[i], mat[r][c] <= m * n` +- All the integers of `arr` are **unique**. +- All the integers of `mat` are **unique**. + + +**Hint:** +1. Can we use a frequency array? +2. Pre-process the positions of the values in the matrix. +3. Traverse the array and increment the corresponding row and column frequency using the pre-processed positions. +4. If the row frequency becomes equal to the number of columns, or vice-versa return the current index. + + + +**Solution:** + +We can follow these steps: + +### Approach + +1. **Pre-process the positions of elements**: + - First, we need to store the positions of the elements in the matrix. We can create a dictionary (`position_map`) that maps each value in the matrix to its `(row, col)` position. + +2. **Frequency Arrays**: + - We need two frequency arrays: one for the rows and one for the columns. + - As we go through the `arr` array, we will increment the frequency of the respective row and column for each element. + +3. **Check for Complete Row or Column**: + - After each increment, check if any row or column becomes completely painted (i.e., its frequency reaches the size of the matrix's columns or rows). + - If so, return the current index. + +4. **Return the result**: + - The index where either a row or column is fully painted is our answer. + +### Detailed Steps +1. Create a map `position_map` for each value in `mat` to its `(row, col)` position. +2. Create arrays `row_count` and `col_count` to track the number of painted cells in each row and column. +3. Traverse through `arr` and for each element, update the respective row and column counts. +4. If at any point a row or column is completely painted, return that index. + +Let's implement this solution in PHP: **[2661. First Completely Painted Row or Column](https://github.com/mah-shamim/leet-code-in-php/tree/main/algorithms/002661-first-completely-painted-row-or-column/solution.php)** + +```php + +``` + +### Explanation: + +1. **Pre-processing positions**: + - We build a dictionary `position_map` where each value in `mat` is mapped to its `(row, col)` position. This helps in directly accessing the position of any value in constant time during the traversal of `arr`. + +2. **Frequency counts**: + - We initialize `row_count` and `col_count` arrays with zeros. These arrays will keep track of how many times a cell in a specific row or column has been painted. + +3. **Traversing the array**: + - For each value in `arr`, we look up its position in `position_map`, then increment the corresponding row and column counts. + - After updating the counts, we check if any row or column has reached its full size (i.e., `row_count[$row] == n` or `col_count[$col] == m`). If so, we return the current index `i`. + +4. **Return Result**: + - The first index where either a row or column is completely painted is returned. + +### Time Complexity: +- **Pre-processing**: We build `position_map` in `O(m * n)`. +- **Traversal**: We process each element of `arr` (which has a length of `m * n`), and for each element, we perform constant-time operations to update and check the row and column frequencies, which takes `O(1)` time. +- Overall, the time complexity is `O(m * n)`. + +### Space Complexity: +- We store the positions of all elements in `position_map`, and we use `O(m + n)` space for the frequency arrays. Therefore, the space complexity is `O(m * n)`. + +This solution should efficiently handle the problem within the given constraints. + +**Contact Links** + +If you found this series helpful, please consider giving the **[repository](https://github.com/mah-shamim/leet-code-in-php)** a star on GitHub or sharing the post on your favorite social networks 😍. Your support would mean a lot to me! + +If you want more helpful content like this, feel free to follow me: + +- **[LinkedIn](https://www.linkedin.com/in/arifulhaque/)** +- **[GitHub](https://github.com/mah-shamim)** \ No newline at end of file diff --git a/algorithms/002661-first-completely-painted-row-or-column/solution.php b/algorithms/002661-first-completely-painted-row-or-column/solution.php new file mode 100644 index 000000000..0da88fbb0 --- /dev/null +++ b/algorithms/002661-first-completely-painted-row-or-column/solution.php @@ -0,0 +1,43 @@ + $value) { + list($row, $col) = $position_map[$value]; + + // Increment the row and column counts + $row_count[$row]++; + $col_count[$col]++; + + // Step 4: Check if any row or column is fully painted + if ($row_count[$row] == $n || $col_count[$col] == $m) { + return $i; + } + } + + // If no row or column is fully painted, return -1 (although the problem guarantees a solution) + return -1; + } +} \ No newline at end of file