题目详情见:https://leetcode-cn.com/problems/rotate-array/
方法一:
两部交换法:
把整个数组看作一个首尾相接的环,因此右移k位,和右移k=k%nums.length位效果相同。把数组分成a( [0,nums.length-k) ),b([nums.length-k,nums.length-1))两部分。
temp = b;a放[k,nums.length-1];b放[0,k)
class Solution {
public void rotate(int[] nums, int k) {
int newbegin = k % nums.length;
int[] temp = new int[newbegin];
for (int i = 0; i < newbegin; i++) {
temp[i] = nums[nums.length - newbegin + i];
}
int len = 1;
for(int i = nums.length - newbegin - 1; i >= 0; i--) {
nums[nums.length - len] = nums[i];
len++;
}
for(int i = 0; i < newbegin; i++) {
nums[i] = temp[i];
}
}
}
时间复杂度:O(n),空间复杂度O(1)
方法二:
暴力法:旋转k次每次将数组旋转1个元素。
转动k次,例如:
初始(k=3) | 1,2,3,4,5,6,7 |
---|---|
1 | 7,1,2,3,4,5,6 |
2 | 6,7,1,2,3,4,5 |
3 | 5,6,7,1,2,3,4 |
public class Solution {
public void rotate(int[] nums, int k) {
int temp, previous;
for (int i = 0; i < k; i++) {
previous = nums[nums.length - 1];
for (int j = 0; j < nums.length; j++) {
temp = nums[j];
nums[j] = previous;
previous = temp;
}
}
}
}
方法三:
使用反转
public class Solution {
public void rotate(int[] nums, int k) {
k %= nums.length;
reverse(nums, 0, nums.length - 1);//整体反转
reverse(nums, 0, k - 1);//前k位反转
reverse(nums, k, 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--;
}
}
}