解題說明
Shift 2D Grid
題目描述:
給定一個 m x n 的二維網格和整數 k,將網格中的元素向右平移 k 次。每次平移時:最後一欄的元素移到下一列的第一欄,右下角的元素移到左上角。回傳平移後的網格。
解題思路:
將二維網格攤平成一維陣列來思考。網格中位置 (i, j) 對應一維索引 i * n + j。平移 k 次後,一維索引 idx 的元素會移到 (idx + k) % (m * n) 的位置。因此只需將攤平的陣列做循環右移 k 步,再重新填回二維即可。為了避免多餘操作,先將 k 取模 m * n。
C++ 解法
複雜度分析
時間複雜度:O(m * n) — 遍歷網格中每個元素一次。
空間複雜度:O(m * n) — 需要一個新的二維陣列儲存結果。
虛擬碼
1. Let total = m * n, k = k % total 2. Create a new m x n grid (ans) 3. For each cell (i, j) in the original grid: a. Compute newIdx = (i * n + j + k) % total b. Place grid[i][j] at ans[newIdx / n][newIdx % n] 4. Return ans
其他解法
攤平 + 旋轉法:先將二維網格攤平成一維 vector,使用 std::rotate 進行循環右移,再重新填回二維。程式碼更簡潔,時間空間複雜度相同。
模擬法 O(k * m * n):逐步模擬每次平移操作。簡單但當 k 很大時效率極差,不推薦。
延伸思考
- 若要求原地修改(不使用額外空間),如何實現循環平移?(提示:三次反轉法)
- 若 k 可能非常大(例如 10^9),你的解法是否仍然高效?
- 如何將此方法推廣到三維陣列的平移?