class Solution {
public:
void rotate(vector<int>& nums, int k) {
int n = nums.size();
k %= n;
if (k == 0) return;
int group = gcd(n, k);
for (int i = 0; i < group; i++) {
int pre = nums[i];
int tmp = 0;
int idx = i + k;
while (idx != i) {
tmp = nums[idx];
nums[idx] = pre;
pre = tmp;
idx = (idx + k) % n;
}
nums[i] = pre;
}
}
};
Time Complexity: O(n)
Space: O(1)
非常好的面試題目,可以從 Space O(n) 優化到 Space O(1)。
優化核心關鍵,在旋轉 k 個的時候可以發現有組的關係。
- Ex: nums = [0, 1, 2, 3], k = 2
- 此時可以發現 (0, 2) 與 (1, 3) 為兩組,也就是 index 為 (0, 2) 與 (1, 3) 無關,他們獨自進行交換。
透過這個觀察可以對 nums 進行分組,總共的組數會是 GCD(len(nums), k) ,這部分可以稍微想一下,應該也不是很困難,這樣就可以在 space O(1) 下完成。