[Leetcode] Rotate Array 旋轉數組

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

後續 Follow Up

Q:若是是向左旋轉k位而不是向右呢?
A:仍是一樣的方法,只是以前在反轉完整個數組後,將其前k個單獨反轉,後面的單獨反轉。而左旋時,咱們是將其後k個單獨反轉,而後前面的單獨反轉。時間

相關文章
相關標籤/搜索