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].code
時間 O(N) 空間 O(N)element
創建一個新數組,將位移過的數字放在新的數組中。it
時間 O(N) 空間 O(1)io
經過三次反轉,咱們能夠很巧妙的實現旋轉數組。首先咱們將整個數組反轉,而後將前k個數字反轉,而後再將後面剩下的數字反轉,就獲得目標數組了。class
反轉數組最簡單的方法是交換元素,而交換元素有至少三種方法(臨時變量,相加相減,異或)變量
k可能大於數組長度,旋轉不止一次,因此咱們要先對k取餘方法
public class Solution { public void rotate(int[] nums, int k) { k = k % nums.length; reverse(nums, 0, nums.length-1); reverse(nums, 0, k-1); reverse(nums, k, nums.length-1); } private void reverse(int[] nums, int i, int j){ while(i<j){ swap(nums, i, j); i++; j--; } } private void swap(int[] nums, int i, int j){ int tmp = nums[i]; nums[i] = nums[j]; nums[j] = tmp; } }
Q:若是是向左旋轉k位而不是向右呢?
A:仍是一樣的方法,只是以前在反轉完整個數組後,將其前k個單獨反轉,後面的單獨反轉。而左旋時,咱們是將其後k個單獨反轉,而後前面的單獨反轉。時間