Rotate Array 数组旋转 leetcode

Rotate an array of n elements to the right by k steps.

For example, with n = 7 and k = 3, the array [1,2,3,4,5,6,7] is rotated to [5,6,7,1,2,3,4].

Note:
Try to come up as many solutions as you can, there are at least 3 different ways to solve this problem.

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

正如note讲到, 此题有很多种解决方案。

方案一:将数组向右移动K次, 时间复杂度O(KN);

public class Solution {
    public void rotate(int[] nums, int k) {
        int len=nums.length;
        k=k%len;
        if(k==0) return ;
        for(int i=0; i0; j--){
                nums[j]=nums[j-1];
            }
            nums[0]=temp;
        }
    }
}
方案二:重新开辟一个新的数组, 然后安要求将元素填入数组。空间复杂度O(n);

方案三: 将数组反转三次, 时间复杂度O(n), 空间复杂度O(1). 首先将数组反转,  则得到前K个元素是旋转数组的前K个元素, 只是顺序相反, 所以需要第二次反转, 后n-k 个元素也是逆序, 所以也需要反转。

例如:[1,2,3,4,5,6,7]

第一次反转[7,6,5,4,3,2,1], 第二次反转[5,6,7,4,3,2,1],  第三次反转[5, 6, 7, 1, 2, 3, 4], 即需要得到的旋转数组。

public class Solution {
    public void rotate(int[] nums, int k) {
        int len=nums.length;
        k=k%len;
        if(k==0) return ;
        reverse(nums, 0, len-1);
        reverse(nums, 0, k-1);
        reverse(nums, k, len-1);
    }

    public void reverse(int[] nums, int begin, int end){
        for(int i=begin, j=end; i



你可能感兴趣的:(Leetcode,leetcode,算法)