5.9
今日
1.leetcode每日一题
1914.循环轮转矩阵
解
class Solution {
public:
vector<vector<int>> rotateGrid(vector<vector<int>>& grid, int k) {
// 获取矩阵的行数 m 和列数 n
int m = grid.size();
int n = grid[0].size();
// 计算总层数:最小边 / 2(比如4x4=2层,2x2=1层)
int layers = min(m, n) / 2;
// 遍历每一层(从外到内,第0层、第1层...)
for (int l = 0; l < layers; l++) {
vector<int> arr; // 存储当前层的所有元素
// 1. 提取当前层的元素(按 顶行→右列→底行→左列 顺序)
// 顶行:左 → 右
for (int i = l; i < n - l; i++) {
arr.push_back(grid[l][i]);
}
// 右列:上 → 下(跳过顶行已经取过的元素)
for (int i = l + 1; i < m - l; i++) {
arr.push_back(grid[i][n - 1 - l]);
}
// 底行:右 → 左(跳过右列已经取过的元素)
for (int i = n - l - 2; i >= l; i--) {
arr.push_back(grid[m - 1 - l][i]);
}
// 左列:下 → 上(跳过底行和顶行已经取过的元素)
for (int i = m - l - 2; i > l; i--) {
arr.push_back(grid[i][l]);
}
// 2. 计算有效旋转次数(旋转len次=没转,取余简化)
int len = arr.size();
int k_mod = k % len;
// 3. 逆时针旋转 k_mod 次(核心:数组重排)
vector<int> new_arr;
for (int i = k_mod; i < len; i++) new_arr.push_back(arr[i]);
for (int i = 0; i < k_mod; i++) new_arr.push_back(arr[i]);
// 4. 把旋转后的元素填回矩阵原位置
int idx = 0; // 新数组的下标
// 填顶行
for (int i = l; i < n - l; i++) {
grid[l][i] = new_arr[idx++];
}
// 填右列
for (int i = l + 1; i < m - l; i++) {
grid[i][n - 1 - l] = new_arr[idx++];
}
// 填底行
for (int i = n - l - 2; i >= l; i--) {
grid[m - 1 - l][i] = new_arr[idx++];
}
// 填左列
for (int i = m - l - 2; i > l; i--) {
grid[i][l] = new_arr[idx++];
}
}
return grid;
}
};
2.健身房练肩

浙公网安备 33010602011771号