LeetCode189.轮转数组

给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。
示例 1:
输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右轮转 1 步: [7,1,2,3,4,5,6]
向右轮转 2 步: [6,7,1,2,3,4,5]
向右轮转 3 步: [5,6,7,1,2,3,4]
示例 2:
输入:nums = [-1,-100,3,99], k = 2
输出:[3,99,-1,-100]
解释:
向右轮转 1 步: [99,-1,-100,3]
向右轮转 2 步: [3,99,-1,-100]

来源:力扣(LeetCode)
链接: https://leetcode.cn/problems/rotate-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

递归法:每次翻转的情况类似

时间复杂度:O(n^2)

空间复杂度:O(n)

易错点:数据覆盖方向要从后往前

//递归法
void twist(int* nums, int numsSize)
{
    int cmp = nums[numsSize-1];
    int len = numsSize-1;
    while (len)
    {
        nums[len] = nums[len-1];
        len--;
    }
    nums[0] = cmp;
}
void rotate(int* nums, int numsSize, int k) 
{
    while(k--)
    {
     twist(nums,numsSize);
    }
}

三次翻转法:观察可得

时间复杂度:O(n)

空间复杂度:O(1)

易错点:翻转次数可能大于数组个数。

void reverse(int* nums, int begin, int end)
{
    while (begin < end)
    {
        int cmp = nums[begin];
        nums[begin] = nums[end];
        nums[end] = cmp;
        begin++;
        end--;
    }
}
void rotate(int* nums, int numsSize, int k) 
{
    k=k%nusSize;
    reverse(nums, 0, numsSize - 1 - k);
    reverse(nums, numsSize - k, numsSize - 1);
    reverse(nums, 0, numsSize - 1);
}

数组拼接法:用momentset来拼接数组

空间复杂度:O(N)

时间复杂度:O(N)

易错点:记得释放空间和指针置空。尽可能不要用指针来接收memcpy返回值,因为局部复制的起点可能不是数组起点。第七行代码的起始地址不是nums+k+1而是nums+numsSize-k,前者只是具体值的巧合。

void rotate(int* nums, int numsSize, int k)
{
    k=k%numsSize;
    int* p = (int*)malloc(sizeof(int) * numsSize);
    if (p == NULL)
        return;
    memcpy(p, nums +numsSize-k, k * sizeof(int));
    memcpy(p+k,nums,(numsSize-k)*sizeof(int));
    memcpy(nums, p, sizeof(int) * numsSize);
     free(p);
     p = NULL;
}

你可能感兴趣的:(leetcode,leetcode)