LeetCode Rotate Array 旋转数组
这个题居然没有记录。原地旋转数组可以见编程珠玑,在JDK代码中也可以找到(Collections.rotate),提供了两种方式一种是做三次reverse,还有一种则是进行遍历替换。
第一种方式:
1 class Solution { 2 public: 3 void rotate(int nums[], int n, int k) { 4 if (nums == NULL || n <= 1) { 5 return; 6 } 7 k = k % n; 8 reverse(nums, 0, n); 9 reverse(nums, 0, k); 10 reverse(nums, k, n); 11 } 12 13 void reverse(int nums[], int start, int end) { 14 int p = start; 15 int q = end-1; 16 while (p < q) { 17 swap(nums[p], nums[q]); 18 p++, q--; 19 } 20 } 21 };
第二种方式:
1 class Solution { 2 public: 3 void rotate(int nums[], int n, int k) { 4 k = k % n; 5 int cnt = n; 6 for (int cycle_start = 0; cnt; cycle_start++) { 7 int i = (cycle_start + k) % n; 8 int replaced = nums[cycle_start]; 9 10 while (i != cycle_start) { 11 swap(replaced, nums[i]); 12 i = (i + k) % n; 13 cnt--; 14 } 15 nums[cycle_start] = replaced; 16 cnt--; 17 } 18 } 19 };
对于第二种方式如果n和k是互质的话进行一轮while循环就可以完成