题目:力扣(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)



















