[LeetCode] Rotate Array,leetcoderotate
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].
Note:
Try to come up as many solutions as you can, there are at least 3 different ways to solve this problem.
解題思路1
首先把數組複製一遍,然後找到元素之間的映射關係: newnum[i] = oldnum[(i - k + n) % n],時間複雜度為O(n),空間複雜度為O(n)。
實現代碼1
/***************************************************************** * @Author : 楚興 * @Date : 2015/2/24 16:58 * @Status : Accepted * @Runtime : 33 ms******************************************************************/class Solution {public: void rotate(int nums[], int n, int k) { int *temp = new int[n]; memcpy(temp, nums, n * sizeof(int)); k = k % n; for (int i = 0; i < n; i++) { nums[i] = temp[(i - k + n) % n]; } delete [] temp; }};
解題思路2
將數組看成是一個環,每個元素每次往前走一步,迴圈k次。時間複雜度為O(k*n),耗時較長,空間複雜度為O(1)。
實現代碼2
/***************************************************************** * @Author : 楚興 * @Date : 2015/2/24 17:10 * @Status : Accepted * @Runtime : 872 ms******************************************************************/class Solution {public: void rotate(int nums[], int n, int k) { k = k % n; while (k--) { int temp = nums[n - 1]; for (int i = n - 1; i > 0; i--) { nums[i] = nums[i - 1]; } nums[0] = temp; } }};
解題思路3
①將整個數組反轉
②將由分割點分割的兩個數組分別反轉
即:1 2 3 4 5 6 7 -> 7 6 5 | 4 3 2 1 -> 5 6 7 | 1 2 3 4
時間複雜度為O(n),空間複雜度為O(1)。
實現代碼3
/***************************************************************** * @Author : 楚興 * @Date : 2015/2/24 17:39 * @Status : Accepted * @Runtime : 25 ms******************************************************************/class Solution {public: void rotate(int nums[], int n, int k) { k = k % n; rev(nums, 0, n - 1); rev(nums, 0, k - 1); rev(nums, k, n - 1); } void rev(int num[], int left, int right) { int temp; while (left < right) { temp = num[left]; num[left++] = num[right]; num[right--] = temp; } }};