算法-数组专题

90 阅读1分钟

给定一个数组,将数组中的元素向右移动 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)。