您的位置:首页 > 其它

leetcode-189 Rotate Array 旋转数组

2015-03-17 21:19 363 查看

《编程之美》P221

Rotate an array ofn elements to the right byk steps.

For example, withn = 7 andk = 3, the array[1,2,3,4,5,6,7]
is rotated to[5,6,7,1,2,3,4].

Note:

Try to come up as many solutions as you can, there are at least 3 differentways to solve this problem.

[show hint]

Hint:

Could you do it in-place with O(1) extra space?

Related problem:Reverse
Words in a String II

Credits:

Special thanks to @Freezen
for addingthis problem and creating all test cases.

解法一:将后k位翻转,再将前n-k位翻转,最后翻转整个数组,即得到结果

public class Solution {
public void rotate(int[] nums, int k) {
//先判断输入参数是否合法
if((nums != null) && (nums.length > 0) && (k > 0))
{
k %= nums.length;
if(k != 0)
{
//颠倒后k个数字
reverse(nums,nums.length - k,nums.length - 1);
//颠倒前n-k个数字
reverse(nums,0,nums.length - k - 1);
//颠倒整个数组
reverse(nums,0,nums.length - 1);
}
}
}

//颠倒一个数组中的所有元素
private void reverse(int[] nums,int start,int end)
{
for(int i = start ; i * 2 <= (start+end); i++)
{
int temp = nums[i];
nums[i] = nums[start+end-i];
nums[start+end-i] = temp;
}
}
}


解法二:将后面k个数分别按倒序移动至头部

即  [1,2,3,4,5,6,7]

k=1: [7,1,2,3,4,5,6]

k=2: [6,7,1,2,3,4,5]

k=3: [5,6,7,1,2,3,4]

明显时间复杂度性能较差

public class Solution {
public void rotate(int[] nums, int k) {
//先判断输入参数是否合法
if((nums != null) && (nums.length > 0) && (k > 0))
{
k %= nums.length;
while(k != 0)
{
reverse_head(nums);
}
}
}

//将数组最后一个数字移至头部
private void reverse_head(int[] nums)
{
int tail = nums[nums.length - 1];
for(int j = nums.length - 1;j > 0; j --)
{
nums[j] = nums[j - 1];
}
nums[0] = tail;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: