84. Shuffle an Array
- Total Accepted: 8552
- Total Submissions: 19157
- Difficulty: Medium
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();
分析:将数组随机化,产生一个随机均匀排列,即对于每个元素A[i],它排在位置j的概率是1/n。算法导论中有一章概率分析和随机算法,
介绍了几种随机排列数组的方法。一个通常的方法是为每一个元素赋一个随机的优先级,优先级通常在1...n的3次方之间。
另一个更好的方法是原址排列给定数组。在进行第i次迭代时,元素A[i]与从元素A[i]至A[n]中随机选取的一个元素进行交换。
第i次迭代以后,A[i]的值不再变。书中有详细的RANDOM_IN_PLACE是随机均匀排列的证明。
class Solution { vector arr; public: Solution(vector nums) { int n=nums.size(); for(int i=0;i reset() { return arr; } /** Returns a random shuffling of the array. */ vector shuffle() { int n=arr.size(); vector tp(n); for(int i=0;i param_1 = obj.reset(); * vector param_2 = obj.shuffle(); */