您的位置:首页 > 编程语言 > Java开发

[Leetcode]Rotate Array java(三种)

2015-06-04 15:05 411 查看
首先注意题目是向右移

Method 1.申明额外空间 一直移位 进行旋转 代码就不给了会超时

Method 2. 交换 (不论是运用递归交换还是公约数进行移动交换)

这里用递归,主要是把要旋转的进行前后进行交换,不过会遇到前后数目不一样,所以交换完后需要递归下一次前后在进行交换直到交换的前后数目一样。

public void rotate(int[] nums, int k) {

if (k >= nums.length)
k = k % nums.length;
if (k == 0 || nums.length == 0)
return;

int n = nums.length;
int i = k;
swap(nums, i, n - i, 0, n);

}

public void swap(int[] nums, int n, int i, int start, int end) {
int temp = 0;
if (n == i) {
for (int j = 0; j < n; j++) {
temp = nums[start + j];
nums[start + j] = nums[end - i + j];
nums[end - i + j] = temp;
}
} else if (n > i) {
for (int j = 0; j < i; j++) {
temp = nums[start + j];
nums[start + j] = nums[end - i + j];
nums[end - i + j] = temp;
}
swap(nums, n - i, i, start, end - i);
} else if (i > n) {
for (int j = 0; j < n; j++) {
temp = nums[start + j];
nums[start + j] = nums[end - n + j];
nums[end - n + j] = temp;
}
swap(nums, n, i - n, start + n, end);
}

}


Method 3. 反转 可以自己举一个例子 先把要旋转的左右分别反转,再反转整个数组。

public void rotate(int[] nums, int k) {

if(k>=nums.length) k=k%nums.length;
if(k==0|| nums.length==0) return;
reverse(nums, 0, nums.length-1-k);
reverse(nums, nums.length-k, nums.length-1);
reverse(nums, 0,nums.length-1);
}
public void reverse(int[] nums,int start,int end){
while(start<end){
int temp=nums[start];
nums[start]=nums[end];
nums[end]=temp;
start++;
end--;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: