LeetCode - 189. Rotate Array

題目中要求翻轉一個數組,注意題目給出的k可能大於數組的長度,所以首先要進行一個預處理,就是k = k % nums.length。解決了這個問題之後,我們可以來考慮翻轉的問題,仔細觀察後發現,可以用三次翻轉數組來解決問題:首先將整個數組反轉,接着翻轉前k個元素,最後翻轉k到第nums.length個元素,這樣就可以實現題目中要求的翻轉。

注意這種方法不僅僅適用於數組,還可以用同樣的思路翻轉鏈表,但是reverse函數要重新寫,整個代碼如下:

public class Solution {
    public void rotate(int[] nums, int k) {
        if(nums == null || nums.length == 0) return;
        
        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 start, int end){
        while(start < end){
            int temp = nums[start];
            nums[start] = nums[end];
            nums[end] = temp;
            start++;
            end--;
        }
    }
}

知識點:

1. 當題目中要求移動/翻轉數組/鏈表k個位置的時候,要多多考慮k大於數組/鏈表長度的情況,這時候使用k % length即可

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章