Welcome to Subscribe On Youtube
3643. Flip Square Submatrix Vertically
Description
You are given an m x n
integer matrix grid
, and three integers x
, y
, and k
.
The integers x
and y
represent the row and column indices of the top-left corner of a square submatrix and the integer k
represents the size (side length) of the square submatrix.
Your task is to flip the submatrix by reversing the order of its rows vertically.
Return the updated matrix.
Example 1:
Input: grid = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]], x = 1, y = 0, k = 3
Output: [[1,2,3,4],[13,14,15,8],[9,10,11,12],[5,6,7,16]]
Explanation:
The diagram above shows the grid before and after the transformation.
Example 2:
Input: grid = [[3,4,2,3],[2,3,4,2]], x = 0, y = 2, k = 2
Output: [[3,4,4,2],[2,3,2,3]]
Explanation:
The diagram above shows the grid before and after the transformation.
Constraints:
m == grid.length
n == grid[i].length
1 <= m, n <= 50
1 <= grid[i][j] <= 100
0 <= x < m
0 <= y < n
1 <= k <= min(m - x, n - y)
Solutions
Solution 1: Simulation
We start from row $x$ and flip a total of $\lfloor \frac{k}{2} \rfloor$ rows.
For each row $i$, we need to swap it with the corresponding row $i_2$, where $i_2 = x + k - 1 - (i - x)$.
During the swap, we need to traverse $j \in [y, y + k)$ and swap $\text{grid}[i][j]$ with $\text{grid}[i_2][j]$.
Finally, return the updated matrix.
The time complexity is $O(k^2)$, where $k$ is the side length of the submatrix. The space complexity is $O(1)$.
-
class Solution { public int[][] reverseSubmatrix(int[][] grid, int x, int y, int k) { for (int i = x; i < x + k / 2; i++) { int i2 = x + k - 1 - (i - x); for (int j = y; j < y + k; j++) { int t = grid[i][j]; grid[i][j] = grid[i2][j]; grid[i2][j] = t; } } return grid; } }
-
class Solution { public: vector<vector<int>> reverseSubmatrix(vector<vector<int>>& grid, int x, int y, int k) { for (int i = x; i < x + k / 2; i++) { int i2 = x + k - 1 - (i - x); for (int j = y; j < y + k; j++) { swap(grid[i][j], grid[i2][j]); } } return grid; } };
-
class Solution: def reverseSubmatrix( self, grid: List[List[int]], x: int, y: int, k: int ) -> List[List[int]]: for i in range(x, x + k // 2): i2 = x + k - 1 - (i - x) for j in range(y, y + k): grid[i][j], grid[i2][j] = grid[i2][j], grid[i][j] return grid
-
func reverseSubmatrix(grid [][]int, x int, y int, k int) [][]int { for i := x; i < x+k/2; i++ { i2 := x + k - 1 - (i - x) for j := y; j < y+k; j++ { grid[i][j], grid[i2][j] = grid[i2][j], grid[i][j] } } return grid }
-
function reverseSubmatrix(grid: number[][], x: number, y: number, k: number): number[][] { for (let i = x; i < x + Math.floor(k / 2); i++) { const i2 = x + k - 1 - (i - x); for (let j = y; j < y + k; j++) { [grid[i][j], grid[i2][j]] = [grid[i2][j], grid[i][j]]; } } return grid; }