leetcode189轮转数组
给定一个整数数组 nums
,将数组中的元素向右轮转 k
个位置,其中 k
是非负数。
最大公约数法:
时间复杂度O(n^2)
空间复杂度O(1)
解析:
k和数组长度的最大公约数为n
代表数据可以分为n组去移动
做n次循环向后移动k位即可
java
public void rotate(int[] nums, int k) {
if(k>=nums.length){
k = k%nums.length;
}
if(k == 0) {
return;
}
int tmpa = k;
int tmpb = nums.length;
int tmpc = 0;
while(tmpb != 0){
tmpc = tmpa%tmpb;
tmpa = tmpb;
tmpb = tmpc;
}
for (int j = 0; j< tmpa; j++) {
//下一次要存的位置
int res = k+j;
int start = nums[j];
for (int i = 0; i < nums.length/tmpa; i++) {
int end = nums[res%nums.length];
nums[res] = start;
res = (res + k) % nums.length;
start = end;
}
}
}
三次反转法
解析:
1234567->5671234
即->7654321-> 765 4321 ->567 1234
三次反转完成
java
public void rotate(int[] nums, int k) {
if(k>=nums.length){
k = k%nums.length;
}
if(k == 0) {
return;
}
this.reverse(nums,0,nums.length-1);
this.reverse(nums,0,k-1);
this.reverse(nums,k,nums.length-1);
}
public void reverse(int[] nums,int start,int end){
int tmp = 0;
while(start < end){
tmp = nums[start];
nums[start] = nums[end];
nums[end] = tmp;
start++;
end--;
}
}