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