1. 程式人生 > 其它 >LeetCode——384. 打亂陣列(Java)

LeetCode——384. 打亂陣列(Java)

題目描述

題幹:
給你一個整數陣列 nums ,設計演算法來打亂一個沒有重複元素的陣列。

實現 Solution class:

Solution(int[] nums) 使用整數陣列 nums 初始化物件
int[] reset() 重設陣列到它的初始狀態並返回
int[] shuffle() 返回陣列隨機打亂後的結果

示例:
輸入
["Solution", "shuffle", "reset", "shuffle"]
[[[1, 2, 3]], [], [], []]
輸出
[null, [3, 1, 2], [1, 2, 3], [1, 3, 2]]
解釋
Solution solution = new Solution([1, 2, 3]);
solution.shuffle();    // 打亂陣列 [1,2,3] 並返回結果。任何 [1,2,3]的排列返回的概率應該相同。
solution.reset();      // 重設陣列到它的初始狀態 [1, 2, 3] 。返回 [1, 2, 3]
solution.shuffle();    // 隨機返回陣列 [1, 2, 3] 打亂後的結果。例如,返回 [1, 3, 2]

題解思路

設計一個打亂陣列順序的類,其中reset方法和初始化物件方法直接複製陣列即可實現

而等概率的隨機打亂陣列方法肯定是要用到Random的方法,這裡採用名叫洗牌演算法的一種方法

每次將第一位與後面數字的其中一位交換順序,然後依次用這種方式往後進行,每次確定新順序的一位

正確程式碼

class RandomArraySolution {
    int[] nums;
    int[] original;

    public RandomArraySolution(int[] nums) {
        this.nums = nums;
        this.original = new int[nums.length];
        System.arraycopy(nums, 0, original, 0, nums.length);
    }
    
    public int[] reset() {
        System.arraycopy(original, 0, nums, 0, nums.length);
        return nums;
    }
    
    public int[] shuffle() {
        Random random = new Random();
        for (int i = 0; i < nums.length; i++) {
            int j = i + random.nextInt(nums.length - i);

            int temp = nums[i];
            nums[i] = nums[j];
            nums[j] = temp;
        }
        return nums;
    }
}

總結

這裡洗牌演算法具體為什麼能保證概率相同就不做證明了,可以去官方題解檢視

倒是自己對random是否可以等概率存取還是挺好奇的,這裡原地交換順序也值得學習

如果文章存在問題或者有更好的題解,歡迎在評論區斧正和評論,各自努力,最高處見