「力扣」189.旋轉數組(第四天)

題目

題目難度:簡單

給定一個數組,將數組中的元素向右移動 k 個位置,其中 k 是非負數。

示例 1:

輸入: [1,2,3,4,5,6,7] 和 k = 3
輸出: [5,6,7,1,2,3,4]
解釋:
向右旋轉 1 步: [7,1,2,3,4,5,6]
向右旋轉 2 步: [6,7,1,2,3,4,5]
向右旋轉 3 步: [5,6,7,1,2,3,4]

解題

暴力

  • 時間複雜度:O(kn)
  • 空間複雜度:O(1)

最次版本(警戒自己)

class Solution {
    public void rotate(int[] nums, int k) {
        int n = nums.length-1;
        int fast = n;
        int slow = n-1;
        for(int i = 0; i < k ; i++){ 
            int temp = nums[fast];
            for(; fast >= 1; fast--){
                nums[fast] = nums[slow--];
            }
            nums[0] = temp;
            fast = n;
            slow = n-1;
        }
    }
}

再改進一點:
旋轉 k 次,每次將數組旋轉 1 個元素。

class Solution {
    public void rotate_1(int[] nums, int k) {
        int n = nums.length;
        k %= n;  //因爲如果k超過n的話,那麼就會有一個輪迴,計算就太耗時了!!
        for (int i = 0; i < k; i++) {
            int temp = nums[n - 1];
            for (int j = n - 1; j > 0; j--) {
                nums[j] = nums[j - 1];
            }
            nums[0] = temp;
        }
    }

使用額外的數組

我們可以用一個額外的數組來將每個元素放到正確的位置上,也就是原本數組裏下標爲 i 的我們把它放到 (i+k)%數組長度 的位置。然後把新的數組拷貝到原數組中。

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

「力扣」299. 猜數字遊戲(第五天)
在這裏插入圖片描述

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