给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
示例:
输入: [1,2,3,4,5,6,7] 和 k = 3 输出: [5,6,7,1,2,3,4] 解释: 向右旋转 1 步: [7,1,2,3,4,5,6] 向右旋转 2 步: [6,7,1,2,3,4,5] 向右旋转 3 步: [5,6,7,1,2,3,
Java代码实现:
java public class RotateArray {
public void rotate(int[] nums,int k){
int n=nums.length; //k可能大于n,所以需要取模 k=k%n;
//先反转整个数组
reverse(nums ,0,n-1);
//再反转前k个元素
reverse(nums ,0,k-1);
//最后反转剩余的元素
reverse(nums ,k,n-1); }
private void reverse(int[] nums,int start,int end){
while(start<end){
int temp=nums[start]; nums[start]=nums[end]; nums[end]=temp; start++; end--;
}
} }
算法思路:
该算法使用三次反转来实现。首先将整个数组反转,然后将前 k 个元素反转,最后将剩余的元素反转。这样就可以得到旋转后的数组。
时间复杂度:O(n),其中 n 是数组的长度。
空间复杂度:O(1)。