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