1. 程式人生 > >Rotate Array陣列旋轉

Rotate Array陣列旋轉

返回將一維陣列向右旋轉k個位置的結果

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]

如果允許額外分配線性空間,那麼可以錯位複製原有陣列的元素。如果允許修改原有陣列,那麼可以通過三次反轉

陣列來實現收旋轉,不需要申請額外空間,並且每次反轉時間為O(n),

三次反轉陣列:第一次反轉整個陣列;第二次反轉陣列的前K個數;第三次反轉陣列剩下的數

例如:

一維陣列[1,2,3,4,5,6,7],k=3

第一次反轉: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) {
        k %= nums.length;//k值超過陣列長度時
        reverse(nums,  0, nums.length-1);//翻轉整個陣列
<span style="white-space:pre">	</span> reverse(nums, 0, k-1);//翻轉前k個數
<span style="white-space:pre">	</span>  reverse(nums, k, nums.length-1);//翻轉剩下的數
    }
    public void reverse(int[] nums, int start, int end) {
        while (start < end) {
            int temp = nums[start];
            nums[start] = nums[end];
            nums[end] = temp;
            start++;
            end--;
        }
    }
}


或者建立新的陣列

public void rotate(int[] nums, int k) {
        int[] a = new int[nums.length];
        for (int i = 0; i < nums.length; i++) {
            a[(i + k) % nums.length] = nums[i];
        }
        for (int i = 0; i < nums.length; i++) {
            nums[i] = a[i];
        }
    }