用构造函数初始化输出的数组。
reset()返回这个数组的原态。
shuffle()返回一个数组的打乱结果
用的是Fisher-Yates 洗牌算法,要让数组的每个排列出现的概率一样,n个字符的数组有n!个排序,为了将这些顺序编码,就得log(n!)个字符
时间复杂度为O(n),空间复杂度为O(n)来存储之前的数组。
重排的步骤就是遍历数组,并生成一个当前下标到末尾的随机下标,然后将当前小标值和随机下标值交换。
class Solution {
int[] array;
int[] original;
Random rand=new Random();
public Solution(int[] nums) {
array=nums;
original=nums.clone();
}
/** Resets the array to its original configuration and return it. */
public int[] reset() {
array=original.clone();
return array;
}
/** Returns a random shuffling of the array. */
public int[] shuffle() {
for(int i=0;i<array.length;i++){
int r=rand.nextInt(array.length-i)+i;
int temp=array[r];
array[r]=array[i];
array[i]=temp;
}
return array;
}
}