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