Rotate Array 部分旋转数组

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].

介绍2种方法,一种空间复杂度为O ( k ), 另一种inplace。

先介绍简单的解法1:

进行观察后,可以想到一种解决方案。

1. 利用额外k空间 (这里 k = 3) , 存储[5, 6, 7 ]

2. 将前面的[1, 2, 3, 4] 后移k 位。此时array变成 [1, 2, 3, 1, 2, 3, 4]

3. 利用存储的值,来更新array 前 k 个值,最后array变成[5, 6, 7, 1, 2, 3, 4]

复杂度:

时间复杂度:O ( n )

空间复杂度:O ( k )

时间:


下面介绍inplace的解法2:

1. 先将原始array全部reverse,原始array变成 [7, 6, 5, 4, 3, 2, 1]

2. 一部分前面的array  reverse, index[0...k-1]的, array变成[5, 6, 7, 4, 3, 2, 1]

3. 将后半部分array reverse, index[k ... n - 1]的,n为原始array的length, array变成[5, 6, 7, 1, 2, 3, 4]

复杂度:

时间复杂度:O ( n )

空间复杂度:O ( 1 )

时间:

代码:

    public void rotateInplace(int[] nums, int k) {
        int n = nums.length;
        k = k % n;
        reverse(nums, 0, n - 1); // reverse whole
        reverse(nums, 0, k - 1); // reverse second part
        reverse(nums, k, n - 1); // reverse first part
    }

    private void reverse(int[] nums, int lo, int hi) {
        while (lo < hi) {
            int temp = nums[lo];
            nums[lo++] = nums[hi];
            nums[hi--] = temp;
        }
    }

参考:

https://leetcode.com/discuss/95631/java-o-n-in-place-solution


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值