旋转数组
将包含 n 个元素的数组向右旋转 k 步。
例如,如果 n = 7 , k = 3,给定数组 [1,2,3,4,5,6,7]
,向右旋转后的结果为 [5,6,7,1,2,3,4]
。
注意:
尽可能找到更多的解决方案,这里最少有三种不同的方法解决这个问题。
提示:
要求空间复杂度为 O(1)
关联的问题: 反转字符串中的单词 II
致谢:
特别感谢 @Freezen 添加此问题并创建所有测试用例。
思路:题目要求复杂度为 O(1),所以别想着复制数组。
解法1:
逐个向前推移,直到所有元素都在目标位置
【补充代码】
解法2:分段反转数组
图片来源:http://blog.csdn.net/congduan/article/details/45222503
int reserve(int* nums,int start,int end)
{
int i,tmp;
int *s = nums+start;
int *e = nums+end;
if(end<=start)
{
return 0;
}
while(s!=e && s<e)
{
tmp = *s;
*s =*e;
*e = tmp;
s++;
e--;
}
return 1;
}
void rotate(int* nums, int numsSize, int k) {
if(numsSize>1)
{
if(k>numsSize)
k%=numsSize;
reserve(nums,0,numsSize-k-1);
reserve(nums,numsSize-k,numsSize-1);
reserve(nums,0,numsSize-1);
}
}