Leetcode-rotate array

来源:互联网 发布:java基础入门答案 编辑:程序博客网 时间:2024/06/16 12:51

旋转数组,

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)的空间复杂度的代码:

void rotate(int* nums, int numsSize, int k) {    k = k%numsSize;    int *tmpArr = (int *)malloc(sizeof(int)*numsSize);    if(!tmpArr)return;    int j=0;    for(int i=numsSize-k;i<numsSize;i++)        tmpArr[j++]=nums[i];    for(int m=0;m<numsSize-k;m++)        tmpArr[j++]=nums[m];    for(int n=0;n<numsSize;n++)        nums[n]=tmpArr[n];}

还有一种O(1)的空间复杂度的,考虑的想法是假设对于上面这个数组,我们可以先将前面一半的1,2,3,4翻转4,3,2,1;再将后面一部分5,6,7翻转成7,6,5,那么整个数组就是4,3,2,1,7,6,5,再将整个数组翻转一次就得到最终的答案了。

void rotate(int* nums, int numsSize, int k) {    k = k%numsSize;    reverse(nums,0,numsSize-k-1);    reverse(nums,numsSize-k,numsSize-1);    reverse(nums,0,numsSize-1);}void reverse(int *nums,int start,int end){    int i=start,j=end;    while(i<j)    {        int tmp;        tmp = nums[i];        nums[i] = nums[j];        nums[j] = tmp;        i++;        j--;    }}