classSolution { public: voidrotateK(vector<int>& nums, int k){ int len = nums.size(); if (len <= 1) return; k %= len; if (k == 0) return; reverse(nums.begin(), nums.end()); reverse(nums.begin(), nums.begin() + k); reverse(nums.begin() + k, nums.end()); }
vector<vector<int>> rotateGrid(vector<vector<int>>& grid, int k) { int m = grid.size(), n = grid[0].size(); int top = 0, bottom = m - 1, left = 0, right = n - 1; while (top < bottom && left < right) { vector<int> nums; // 逆时针提取一圈 for (int r = top; r <= bottom; r++) nums.push_back(grid[r][left]); for (int c = left + 1; c <= right; c++) nums.push_back(grid[bottom][c]); for (int r = bottom - 1; r >= top; r--) nums.push_back(grid[r][right]); for (int c = right - 1; c > left; c--) nums.push_back(grid[top][c]);
rotateK(nums, k); // 循环左移
// 按相同顺序填回 int idx = 0; for (int r = top; r <= bottom; r++) grid[r][left] = nums[idx++]; for (int c = left + 1; c <= right; c++) grid[bottom][c] = nums[idx++]; for (int r = bottom - 1; r >= top; r--) grid[r][right] = nums[idx++]; for (int c = right - 1; c > left; c--) grid[top][c] = nums[idx++];