LC 旋转数组

Posted yangbocsu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LC 旋转数组相关的知识,希望对你有一定的参考价值。

LC 旋转数组


给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。

进阶:

  • 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
  • 你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗?

思路一: 先实现移动数组的最后一位,再套一个循环移动k次

class Solution {
    public void rotate(int[] nums, int k) 
    {
        int length = nums.length;
        if (nums == null || length == 0)//边界处理
        {
            return;
        }
        k= k % length;
        for (int i = 0; i < k; i++)
        {
            int temp = nums[length - 1];
            for (int j = length - 1; j >0; j--)//移动一位
            {
                nums[j] = nums[j -1];
            }
            nums[0] = temp;
        }

    }
}


思路没有问题,但是超时了!!! 当数据量小的时候没有问题,但是数据量大的时候就有问题了。


思路二: 创立一个新数组,先将数组的后k位移到新数组,再移剩下的数组;

class Solution {
    public void rotate(int[] nums, int k) 
    {
        int length = nums.length;
        if (nums == null || length == 0)
        {
            return;
        }


        k= k % length;
        int[] arr = new int[length];//临时新数组
        
        //先移动num[]的后k位;
        for (int i = length-k,j=0; i<length; i++,j++)
        {
           arr[j] = nums[i];
        }
        
        //再移动剩下的
        for (int i = 0,j=k; j < length; i++,j++)
        {
            arr[j] = nums[i];
        }

        //将移好后顺序 置于 num[]
        for (int i = 0; i < length; i++) 
        {
            nums[i] = arr[i];
        }

    }
}


这次虽然没有超时,但是内存消耗比较大。

看官方的:





以上是关于LC 旋转数组的主要内容,如果未能解决你的问题,请参考以下文章

LC 旋转图像

算法刷题:LC初级算法

算法刷题:LC初级算法

算法刷题:LC初级算法

算法刷题:LC初级算法

处理屏幕旋转上的片段重复(带有示例代码)