384. Shuffle an Array
暴力重排
class Solution:
def __init__(self, nums: List[int]):
self.nums = nums[:]
self.tmp = nums[:]
def reset(self) -> List[int]:
"""
Resets the array to its original configuration and return it.
"""
return self.nums[:]
def shuffle(self) -> List[int]:
"""
Returns a random shuffling of the array.
"""
self.tmp = self.nums[:]
res = []
size, tmpsize = len(self.tmp), len(self.tmp)-1
for i in range(size):
res.append(self.tmp.pop(random.randint(0,tmpsize)))
tmpsize -= 1
return res
洗牌算法
通过元素互换,避免列表修改(删除)来节省时间。
class Solution:
def __init__(self, nums: List[int]):
self.nums = nums[:]
self.tmp = nums[:]
def reset(self) -> List[int]:
"""
Resets the array to its original configuration and return it.
"""
self.tmp = self.nums[:]
return self.tmp
def shuffle(self) -> List[int]:
"""
Returns a random shuffling of the array.
"""
size = len(self.tmp)
for i in range(size):
#第i步,相当于从剩下的[i, size)元素中随机选取一个放到第i个位置
swap_idx = random.randint(i, size-1)
self.tmp[i], self.tmp[swap_idx] = self.tmp[swap_idx], self.tmp[i]
return self.tmp
本文介绍了两种不同的洗牌算法,一种是暴力重排,通过元素互换实现;另一种是通过随机选择并交换元素,避免了列表删除操作,提高了效率。这两种方法都能生成数组的随机排列,并且在`reset`方法中可以快速恢复到原始配置。
402

被折叠的 条评论
为什么被折叠?



