给定一个整数数组 nums
,将数组中的元素向右轮转 k
个位置,其中 k
是非负数。
提示:
1 <= nums.length <= 10^5
-2^31 <= nums[i] <= 2^31 - 1
0 <= k <= 10^5
数组移动
解:一个一个的移动。(超时了)
class Solution {
// 数组移动
public void rotate(int[] nums, int k) {
k = k % nums.length;
for (int i = 0; i < k; i++) {
move(nums);
}
}
private void move(int[] nums){
int end = nums[nums.length - 1];
for(int i = nums.length-1; i > 0; i--){
nums[i] = nums[i - 1];
}
nums[0] = end;
}
}
用额外数组实现轮转
解:假设k = 1,nums = [1 , 2 , 3 , 4] ====> ans_nums = [4 , 1 , 2 , 3],能够看到先将后k个放到前面,剩下的放在数组后面。
class Solution {
public void rotate(int[] nums, int k) {
int[] temp_nums = new int[nums.length];
int idx = 0;
k = k % nums.length;
for(int i = nums.length - k; i < nums.length; i++){
temp_nums[idx++] = nums[i];
}
for(int i = 0; i < nums.length - k; i++){
temp_nums[idx++] = nums[i];
}
for(int i = 0; i < nums.length; i++){
nums[i] = temp_nums[i];
}
}
}
原地旋转
解:先整体旋转整个数组,再分别旋转[0, k),[k, nums.length)数组。
思路:灵茶山艾府
class Solution {
public void rotate(int[] nums, int k) {
k %= nums.length;
reverse(nums, 0 , nums.length - 1);
reverse(nums, 0 , k - 1);
reverse(nums, k , nums.length - 1);
}
private void reverse(int[] nums, int begin , int end){
while(begin < end){
int temp = nums[begin];
nums[begin] = nums[end];
nums[end] = temp;
begin++;
end--;
}
}
}