【leetcode-数组】 旋转数组

给定一个数组,将数组中的元素向右移动 个位置,其中 是非负数。

示例 1:

输入: [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,4]

示例 2:

输入: [-1,-100,3,99]k = 2
输出: [3,99,-1,-100]
解释: 
向右旋转 1 步: [99,-1,-100,3]
向右旋转 2 步: [3,99,-1,-100]

说明:

  • 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
  • 要求使用空间复杂度为 O(1) 的 原地 算法。

解法一:先反转前 n-k个元素, 再反转后k个元素, 最后再所有反转一次;

class Solution {
    public void rotate(int[] nums, int k) {
        if(nums==null || nums.length<2) {
            return;
        }
        k = k%nums.length;
        
        reverse(nums, 0, nums.length-1-k);
        reverse(nums, nums.length-k,nums.length-1 );
        reverse(nums, 0, nums.length-1);
    }
    
    public void reverse(int[] nums, int start, int end) {
        while(start<end) {
            int tmp = nums[start];
            nums[start++]=nums[end];
            nums[end--]=tmp;
        }
    }
}

解法二:第i位置的元素,旋转后位置应该是 (i+k)%n;  把(i+k)%n位置的元素取出来先放在临时变量里, 然后再看(i+k)%n 应该放在哪个位置, 再把相应位置的元素放在临时变量里,依次遍历。

class Solution {
    public void rotate(int[] nums, int k) {
        if(nums==null || nums.length<2 || k%nums.length==0) {
            return;
        }
        
        int n = nums.length;
        k = k%n;
        
        
        int start=0;
        int i=0;
        int cur = nums[i];
        int cycleCount = 0;
        
        while(cycleCount++<n) {
            i = (i+k)%n;
            int t = nums[i];
            nums[i]=cur;
            
            if(i==start) {
                //循环过的起点了
                ++start;
                ++i;
                cur = nums[i];
            }else{
                 cur = t;
            }
        }
    }
}

解法3:利用o(n)空间,  第i位置的元素,旋转后位置应该是 (i+k)%n; 

class Solution {
    public void rotate(int[] nums, int k) {
        if(nums==null || nums.length==0) {
            return;
        }
        
        int n = nums.length;
        k = k % n;
        
        int[] result = new int[n];
        for(int i=0;i<n;i++) {
            result[(i+k)%n]=nums[i];
        }
        
       nums = result;
    }
}
发布了205 篇原创文章 · 获赞 219 · 访问量 30万+

猜你喜欢

转载自blog.csdn.net/kangbin825/article/details/105141493