题目链接:https://leetcode.com/problems/rotate-array/
Given an array, rotate the array to the right by k steps, where k is non-negative.
Example 1:
Input:[1,2,3,4,5,6,7]
and k = 3 Output:[5,6,7,1,2,3,4]
Explanation: rotate 1 steps to the right:[7,1,2,3,4,5,6]
rotate 2 steps to the right:[6,7,1,2,3,4,5]
rotate 3 steps to the right:[5,6,7,1,2,3,4]
Example 2:
Input: [-1,-100,3,99]
and k = 2
Output: [3,99,-1,-100]
Explanation:
rotate 1 steps to the right: [99,-1,-100,3]
rotate 2 steps to the right: [3,99,-1,-100]
Note:
- Try to come up as many solutions as you can, there are at least 3 different ways to solve this problem.
- Could you do it in-place with O(1) extra space?
思路一:
利用辅助数组
AC 1ms:
class Solution {
public void rotate(int[] nums, int k) {
k=k%nums.length;
int[] array=new int[nums.length];
for(int i=0,j=nums.length-k;i<k;i++,j++){
array[i]=nums[j];
}
for(int i=k,j=0;i<nums.length;i++,j++){
array[i]=nums[j];
}
for(int i=0;i<nums.length;i++)
nums[i]=array[i];
}
}
时间复杂度O(2*N)=O(n),空间复杂度O(n)。
思路二:
数组逆置,时间复杂度O(n),空间O(1)。
AC 0ms:
class Solution {
public void rotate(int[] nums, int k) {
k=k%nums.length;
reverse(nums,0,nums.length-1);
reverse(nums,0,k-1);
reverse(nums,k,nums.length-1);
}
public void reverse(int[] nums,int i,int j){
while(i<j){
int temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
i++;
j--;
}
}
}