原题链接在这里:https://leetcode.com/problems/shuffle-an-array/
题目:
Shuffle a set of numbers without duplicates.
Example:
// Init an array with set 1, 2, and 3. int[] nums = {1,2,3}; Solution solution = new Solution(nums); // Shuffle the array [1,2,3] and return its result. Any permutation of [1,2,3] must equally likely to be returned. solution.shuffle(); // Resets the array back to its original configuration [1,2,3]. solution.reset(); // Returns the random shuffling of array [1,2,3]. solution.shuffle();
题解:
Shuffle时每个数字在小于它的方位内 swap 一次.
j = random.nextInt(i+1). j is picked randomly from [0,i].
有两种可能
1. j == i, 那么nums[i]就没有换位置. 概率是1/(1+i).
2. j != i, 那么nums[i]就换位置了, 另外[0, i-1] 之间 i choices, 任选一个数与其对调. 概率是 (1-1/(1+i)) * (1/i) = 1/(1+i).
以此类推后就表明,结果中任何一个数字都有相等的概率在任意个位置上. 就是any permutation has same 概率.
Time Complexity: reset, O(1). shuffle, O(nums.length).
Space: O(nums.length).
AC Java:
1 class Solution { 2 int [] nums; 3 Random random; 4 5 public Solution(int[] nums) { 6 this.nums = nums; 7 random = new Random(); 8 } 9 10 /** Resets the array to its original configuration and return it. */ 11 public int[] reset() { 12 return this.nums; 13 } 14 15 /** Returns a random shuffling of the array. */ 16 public int[] shuffle() { 17 int [] arr = nums.clone(); 18 for(int i = 0; i<nums.length; i++){ 19 int j = random.nextInt(i+1); 20 swap(arr, i, j); 21 } 22 23 return arr; 24 } 25 26 private void swap(int [] nums, int i, int j){ 27 int temp = nums[i]; 28 nums[i] = nums[j]; 29 nums[j] = temp; 30 } 31 } 32 33 /** 34 * Your Solution object will be instantiated and called as such: 35 * Solution obj = new Solution(nums); 36 * int[] param_1 = obj.reset(); 37 * int[] param_2 = obj.shuffle(); 38 */