轮转数组------题解报告

题目:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

题解:

如果直接暴力双循环会时间超限,所以我选择了一个空间复杂度比较高的方法。直接再创建一个数组,然后对应位置替换,最后把值赋给原来的nums数组。

 public void rotate(int[] nums, int k) {
        int []ans = new int[nums.length];
        k= k% nums.length;
        for(int i=0;i< nums.length;i++)
        {
            ans[i]=nums[(i+ nums.length-k)% nums.length];
        }
        for(int i=0;i<nums.length;i++)
        {
            nums[i]=ans[i];
        }
//        for(int i=0;i<nums.length;i++)
//            System.out.print(nums[i]+"    ");
    }

但是这种方法空间复杂度有些高了,只能说是大家都能想到的办法,还有没有更好的办法?

当然有,那就是翻转数组,首先我们来观察一下样例

输入:1 2 3 4 5 6 7

输出:5 6 7 1 2 3 4

有没有发现什么?如果没有,让我们把输入的数组翻转一下

输入:7 6 5 4 3 2 1(翻转后)

输出:5 6 7 1 2 3 4

现在发现了吧,我们以数组中第k个元素为界分开

输入:7 6 5                 4 3 2 1(翻转后)

输出:5 6 7                 1 2 3 4

观察到这里,我们就可以写代码了

public void rotate(int[] nums, int k) {
        k %= nums.length;
        reverse(nums, 0, nums.length - 1);
        reverse(nums, 0, k - 1);
        reverse(nums, k, nums.length - 1);
    }

    public void reverse(int[] nums, int l, int r) {
        while (l < r) {
            int temp = nums[l];
            nums[l] = nums[r];
            nums[r] = temp;
            l++;
            r--;
        }
    }

 

 此时空间复杂度为O(1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值