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.健身房练肩

posted @ 2026-05-09 21:26  douzishuo  阅读(13)  评论(0)    收藏  举报