今日
1.leetcode每日一题
1914.循环轮转矩阵
解
class Solution {
public:vector<vector<int>> rotateGrid(vector<vector<int>>& grid, int k) {// 获取矩阵的行数 m 和列数 nint 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.健身房练肩
