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;
    }
    
    

All Problems

All Solutions