0
点赞
收藏
分享

微信扫一扫

leetcode-189.轮转数组

M4Y 2022-03-18 阅读 161

https://leetcode-cn.com/problems/rotate-array/

        解法一:首先取k=k%numsSize(因为移numsSize个位置和不移动是一样的结果)。注意到下标为i的元素向右轮转k个位置后,元素的新位置下标为(i+k)%numsSize,索性创建一个新数组,用来存储元素移动后的结果。最后把新数组拷贝回原数组。

void rotate(int* nums, int numsSize, int k){
    k%=numsSize;  //0<=k<numsSize
    int* a=(int*)malloc(sizeof(int)*numsSize);
    for(int i=0;i<numsSize;i++){
        a[(i+k)%numsSize]=nums[i];
    }
   // (i+k)%numsSize
    for(int i=0;i<numsSize;i++){
        nums[i]=a[i];
    }
    free(a);
}

        解法二:由于第一种解法创建了一个新数组,总觉得浪费了内存空间,去看了官方题解,发现了一种相对简单的解法,把空间复杂度从O(n)降为O(1)。基本思路就是反转三次数组。

void change(int*nums,int left,int right){
    while(left<=right){
        int change=nums[left];
        nums[left]=nums[right];
        nums[right]=change;
        left++;
        right--;
    }
}

void rotate(int* nums, int numsSize, int k){
    k%=numsSize;
    change(nums,0,numsSize-1);
    change(nums,0,k-1);
    change(nums,k,numsSize-1);
}
举报

相关推荐

0 条评论