Leetcode -Rotate Array

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].

[分析] 用到的技巧,全局reverse再局部reverse完成偏移若干位操作。

public class Solution {
    // method 1: time O(N), space O(N)
    public void rotate1(int[] nums, int k) {
        if (nums == null || nums.length == 0 || k % nums.length == 0)
            return;
        int n = nums.length;
        k = k % n;
        int[] tmp = new int[k];
        for (int i = 0; i < k; i++) {
            tmp[i] = nums[n - k + i];
        }
        for (int i = n - k - 1; i >= 0; i--) {
            nums[i + k] = nums[i];
        }
        for (int i = 0; i < k; i++) {
            nums[i] = tmp[i];
        }
    }
    // method 2: time O(k * n), space O(1), timeout
    public void rotate2(int[] nums, int k) {
        if (nums == null || nums.length == 0 || k % nums.length == 0)
            return;
        int n = nums.length;
        k = k % n;
        if (k < n / 2) {
            for (int i = 0; i < k; i++) {
                int tmp = nums[n - 1];
                for (int j = n - 1; j > 0; j--) {
                    nums[j] = nums[j - 1];
                }
                nums[0] = tmp;
            }
        } else {
            for (int i = 0; i < k; i++) {
                int tmp = nums[0];
                for (int j = 0; j < n - 1; j++) {
                    nums[j] = nums[j + 1];
                }
                nums[n - 1] = tmp;
            }
        }
    }
    // method 3: time O(n), space O(1)
    public void rotate(int[] nums, int k) {
        if (nums == null || nums.length == 0 || k % nums.length == 0)
            return;
        int n = nums.length;
        k = k % n;
        reverse(nums, 0, n - 1);
        reverse(nums, 0, k - 1);
        reverse(nums, k, n - 1);
    }
    public void reverse(int[] nums, int left, int right) {
        while (left < right) {
            int tmp = nums[left];
            nums[left] = nums[right];
            nums[right] = tmp;
            left++;
            right--;
        }
    }
    
}

猜你喜欢

转载自likesky3.iteye.com/blog/2228927