题目描述
- 中等题,很赞!第一次碰到涉及洗牌算法的题
- 有点涉及概率,主要是要实现公平的随机
思路 && 代码
- 采用了 Knuth 洗牌算法,可以看看这篇博客
- 时间复杂度O(N),空间复杂度O(N)
class Solution {
int[] nums;
Random random = new Random();
public Solution(int[] nums) {
this.nums = nums;
}
// 直接返回原版本
public int[] reset() {
return nums;
}
// clone 一个原版本,然后进行洗牌算法:
public int[] shuffle() {
int[] ans = nums.clone();
for(int i = 0; i < ans.length; i++) swap(ans, i, i + random.nextInt(ans.length - i));
return ans;
}
void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}