Rotate Array陣列旋轉
阿新 • • 發佈:2019-01-25
返回將一維陣列向右旋轉k個位置的結果
Rotate an array of n elements to the right by k steps.
For example, with n = 7 and k = 3, the array [1,2,3,4,5,6,7]
is
rotated to [5,6,7,1,2,3,4]
如果允許額外分配線性空間,那麼可以錯位複製原有陣列的元素。如果允許修改原有陣列,那麼可以通過三次反轉
陣列來實現收旋轉,不需要申請額外空間,並且每次反轉時間為O(n),
三次反轉陣列:第一次反轉整個陣列;第二次反轉陣列的前K個數;第三次反轉陣列剩下的數
例如:
一維陣列[1,2,3,4,5,6,7],k=3
第一次反轉:7,6,5,4,3,2,1
第二次反轉:5,6,7,4,3,2,1
第三次反轉:5,6,7,1,2,3,4 最終結果
public class Solution { public void rotate(int[] nums, int k) { k %= nums.length;//k值超過陣列長度時 reverse(nums, 0, nums.length-1);//翻轉整個陣列 <span style="white-space:pre"> </span> reverse(nums, 0, k-1);//翻轉前k個數 <span style="white-space:pre"> </span> reverse(nums, k, nums.length-1);//翻轉剩下的數 } public void reverse(int[] nums, int start, int end) { while (start < end) { int temp = nums[start]; nums[start] = nums[end]; nums[end] = temp; start++; end--; } } }
或者建立新的陣列
public void rotate(int[] nums, int k) {
int[] a = new int[nums.length];
for (int i = 0; i < nums.length; i++) {
a[(i + k) % nums.length] = nums[i];
}
for (int i = 0; i < nums.length; i++) {
nums[i] = a[i];
}
}