题目链接:https://leetcode.com/problems/rotate-array/
题目:
Rotate an array of n elements to the right by k steps.
For example, with n = 7 and k = 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 different ways to solve this problem.
Hint:
Could you do it in-place with O(1) extra space?
Could you do it in-place with O(1) extra space?
思路:
1、用另一个数组保存,空间复杂度为O(n),时间复杂度为O(n)
2、两边逆序,整个数组逆序。空间复杂度O(1),时间复杂度O(n)
3、数组平移,往右移动一个将覆盖的元素赋给最左开始的元素。空间复杂度为O(1),时间复杂度为O(n)
算法1:
public void rotate(int[] nums, int k) {
if (k > nums.length) {
k = k % nums.length;
}
int tmp[] = (int[]) nums.clone();
for (int i = 0; i < k; i++) {
nums[i] = tmp[tmp.length - k + i];
}
for (int i = 0; i < (tmp.length - k); i++) {
nums[k + i] = tmp[i];
}
}
public void rotate(int[] nums, int k) {
k = k % nums.length;
nums = reverse(nums, 0, nums.length-k-1);
nums = reverse(nums, nums.length-k,nums.length-1);
nums = reverse(nums, 0, nums.length-1);
}
public int [] reverse(int[] arr, int left, int right){
if(arr == null || arr.length == 1)
return arr;
for(int i=0;i<(right-left+1)/2;i++){
int tmp = arr[left+i];
arr[left+i] = arr[right-i];
arr[right-i] = tmp;
}
return arr;
}