方法一,空间复杂度为O(n).
class Solution {
public void rotate(int[] nums, int k) {
//想不出来空间复制度为O(1)的方法,只能用最笨的方法,复制一个相同的数组
int[] tmp = new int[nums.length];
for(int i = 0; i < nums.length; i++) {
tmp[i] = nums[i];
}
for(int i = 0; i < nums.length; i++) {
int idx = (i+k)%nums.length;
nums[idx] = tmp[i];
}
}
}
方法二:空间复杂度为O(1),最优方法 可以观察到该题可以该题其实操作后两组元素的顺序还是保存不变的,然后通过翻转等性质可以得到答案 图解(引用自leetcode上大佬的题解)
第一步
第二步
第三步
最后一步
代码如下:
class Solution {
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 i,int j) {
while(i < j) {
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
i++;
j--;
}
}
}