LeetCode——384. 打亂陣列(Java)
阿新 • • 發佈:2021-11-22
題目描述
題幹: 給你一個整數陣列 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是否可以等概率存取還是挺好奇的,這裡原地交換順序也值得學習
如果文章存在問題或者有更好的題解,歡迎在評論區斧正和評論,各自努力,最高處見