垂直翻转子矩阵-LeetCode
3643. 垂直翻转子矩阵
🎯 问题描述(来源于LeetCode)
描述:
给你一个 m x n 的整数矩阵 grid,以及三个整数 x、y 和 k。
x 和 y 表示一个 正方形子矩阵 的左上角下标,k 表示该正方形子矩阵的边长。
你的任务是垂直翻转该子矩阵的行顺序(即上下翻转),并返回更新后的矩阵。
说明:
- 垂直翻转:子矩阵的第一行与最后一行交换,第二行与倒数第二行交换,以此类推。
- 子矩阵外的元素保持不变。
- 你可以直接在原矩阵上修改,也可以使用额外空间。
示例:
- 示例 1:
1 | 输入: grid = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]], x = 1, y = 0, k = 3 |
- 示例 2:
1 | 输入: grid = [[3,4,2,3],[2,3,4,2]], x = 0, y = 2, k = 2 |
💻 解题思路
思路:双指针逐行交换(原地修改)
算法步骤
- 确定子矩阵边界:
- 顶部行:
top = x - 底部行:
bottom = x + k - 1
- 顶部行:
- 双指针交换行:
- 当
top < bottom时,进行循环:- 遍历子矩阵的每一列
j,范围从y到y + k - 1。 - 交换
grid[top][j]和grid[bottom][j]的值。 - 交换完成后,
top向下移动一行(top++),bottom向上移动一行(bottom--)。
- 遍历子矩阵的每一列
- 当
- 返回结果:原地修改矩阵后,直接返回
grid。
代码实现(你的代码)
1 | from typing import List |
📊 性能分析
- 时间复杂度:,因为需要遍历子矩阵中一半的行( 行),每行有 个元素需要交换。
- 空间复杂度:,仅使用了有限的几个指针变量,在原矩阵上直接进行修改。
思考
你的解法非常经典,直接利用了双指针(或称为对撞指针)的思想。它通过同时从子矩阵的顶部和底部向中间遍历,并交换对应行的所有元素,高效地完成了垂直翻转。
优点:
- 原地修改:没有使用额外的矩阵空间,内存效率高。
- 逻辑清晰:代码直观地反映了“上下交换行”这一操作本质。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 笺札!






