旋转数组
题意:
给定一个数组,将数组向右旋转k步,其中 k 为非负数。
范例1:
输入: [1,2,3,4,5,6,7]和k = 3
输出: [5,6,7,1,2,3,4]
说明:
向右旋转1步:向右[7,1,2,3,4,5,6]
旋转2步:向右[6,7,1,2,3,4,5]
旋转3步:[5,6,7,1,2,3,4]
范例2:
输入: [-1,-100,3,99]和k = 2
输出: [3,99,-1,-100]
说明:
向右旋转1步:[99,-1,-100,3]
向右旋转2步:[3,99,-1,-100]
解题思路
第一种方法:使用额外的辅助空间数组向右旋转k步就是重新找到这个数出现在数组中的位置k可以大于数组的长度很容易想到数字重新定位在k%len的位置上遍历一遍数组既可以求解
第二种方法:把数组分成两部分0,len-k-1一部分和len-k,len-1一部分
分别旋转两部分的数最后再反转0,len-1整个数组即可求解
代码解析
第一种方法
时间复杂度为O(N)
空间复杂度为O(N)
public void rotateArr(int[] nums, int k) {
int[] a = new int[nums.length];
for (int i = 0; i < nums.length; i++) {
a[(i + k) % nums.length] = nums[i];
}
for (int i = 0; i < nums.length; i++) {
nums[i] = a[i];
}
}
第二种方法
时间复杂度为O(N)
空间复杂度为O(1)
public void rotateArr(int[] nums, int k) {
int len = nums.length;
k=k%len;
rotateArray(nums,0,len-k-1);
rotateArray(nums,len-k,len-1);
rotateArray(nums,0,len-1);
System.out.println();
}
private void rotateArray(int[] nums, int start, int end) {
for (int i = start,j=end; i < j; i++,j--) {
swap(nums,i,j);
}
}
private void swap(int[] nums,int i,int j){
int temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
}