384.打乱数组
题目描述
思路
暴力解法
首先考虑如何随机打乱一个数组。不妨设数组nums的长度为n,可以使用如下方法打乱:
- 将数组中的所有数放到数据结构中,并初始化打乱后的数组shuffled;
- 循环n次,在第i次循环中(0 <= i < n):
- 在数据结构中取出一个数num,将其作为打乱后的数组shuffled的第i个元素;
- 从数据结构中移除num。
对于原数组中的数num来说,被移动到打乱后的数组的任一位置的概率都是相同的。
在具体实现过程中,可以定义originals数组用来存储数组的初始状态,用于重设数组到初始状态;用数组实现上述过程中的数据结构。
Python实现
# 暴力
class Solution:
def __init__(self, nums: List[int]):
self.nums = nums
self.originals = nums.copy()
def reset(self) -> List[int]:
self.nums = self.originals.copy()
return self.nums
def shuffle(self) -> List[int]:
shuffled = [0] * len(self.nums)
for i in range(len(self.nums)):
j = random.randrange(len(self.nums))
shuffled[i] = self.nums.pop(j)
self.nums = shuffled
return self.nums
Java实现
// 暴力
class Solution {
private int[] nums;
private int[] originals;
public Solution(int[] nums) {
this.nums = nums;
this.originals = new int[nums.length];
System.arraycopy(nums, 0, originals, 0, nums.length);
}
public int[] reset() {
System.arraycopy(originals, 0, nums, 0, nums.length);
return nums;
}
public int[] shuffle() {
int[] shuffled = new int[nums.length];
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < nums.length; ++i) {
list.add(nums[i]);
}
Random random = new Random();
for (int i = 0; i < nums.length; ++i) {
int j = random.nextInt(list.size());
shuffled[i] = list.remove(j);
}
System.arraycopy(shuffled, 0, nums, 0, nums.length);
return nums;
}
}