leetcode Easy题目:Rotate Array
30 March 2015
题目
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].
大意是给定一个数组,把倒数第k个数之后的交换到数组的最前面。
解题思路
最自然的思路是申请k个数的空间保存后面k个数,然后把前面n-k个挪k个位置,然后再把后面k个拼到最前面。
但是这种思路必然要使用O(n)的空间。实在没有想到更好的办法,就先写了这个。
class Solution {
public:
void rotate(int nums[], int n, int k) {
if (k > n)
k = k % n;
int* temp = (int*)malloc(sizeof(int) * k);
memcpy(temp, nums+n-k, sizeof(int) * k);
for(int i=n-k-1; i>=0; i--)
{
nums[(i+k)%n] = nums[i];
}
memcpy(nums, temp, sizeof(int) * k);
}
}
这里要注意的是边界条件,k > n的情况。
牛逼的思路
AC以后看了看discussion,瞬间给跪了。
void rotate(int nums[], int n, int k) {
k %= n; // if k > n then the final result is the same as k%n
reverseArray(nums, n-k, n-1);
reverseArray(nums, 0, n-k-1);
reverseArray(nums, 0, n-1);
}
/**
* rotate the array nums from start to end
**/
void reverseArray(int nums[],int start, int end){
while(start < end){
int temp = nums[start];
nums[start++] = nums[end];
nums[end--] = temp;
// or you can simply code as "std::swap(nums[start++], nums[end--])" to replace above three lines
}
}
其实就是先把前n-k倒置,把后k倒置,再把整个数组倒置,就完成了旋转。其中的原理用到了线性代数的东西。
(XT · YT) ^ T = YX
哎,真是数学没好好学害死人啊。