題目
題目難度:簡單
給定一個數組,將數組中的元素向右移動 k 個位置,其中 k 是非負數。
示例 1:
輸入: [1,2,3,4,5,6,7] 和 k = 3
輸出: [5,6,7,1,2,3,4]
解釋:
向右旋轉 1 步: [7,1,2,3,4,5,6]
向右旋轉 2 步: [6,7,1,2,3,4,5]
向右旋轉 3 步: [5,6,7,1,2,3,4]
解題
暴力
- 時間複雜度:O(kn)
- 空間複雜度:O(1)
最次版本(警戒自己)
class Solution {
public void rotate(int[] nums, int k) {
int n = nums.length-1;
int fast = n;
int slow = n-1;
for(int i = 0; i < k ; i++){
int temp = nums[fast];
for(; fast >= 1; fast--){
nums[fast] = nums[slow--];
}
nums[0] = temp;
fast = n;
slow = n-1;
}
}
}
再改進一點:
旋轉 k 次,每次將數組旋轉 1 個元素。
class Solution {
public void rotate_1(int[] nums, int k) {
int n = nums.length;
k %= n; //因爲如果k超過n的話,那麼就會有一個輪迴,計算就太耗時了!!
for (int i = 0; i < k; i++) {
int temp = nums[n - 1];
for (int j = n - 1; j > 0; j--) {
nums[j] = nums[j - 1];
}
nums[0] = temp;
}
}
使用額外的數組
我們可以用一個額外的數組來將每個元素放到正確的位置上,也就是原本數組裏下標爲 i 的我們把它放到 (i+k)%數組長度 的位置。然後把新的數組拷貝到原數組中。
class Solution {
public void rotate(int[] nums, int k) {
int n = nums.length;
int arr[] = new int[n];
for(int i = 0 ; i < n; i++){
arr[(i+k)%n] = nums[i];
}
for(int j = 0; j < n; j++){
nums[j] = arr[j];
}
}
}