Knuth洗牌算法
- In iteration i, pick integer r between 0 and i uniformly at random
- Swap a[i] and a[r]
时间复杂度O(n)
Go语言描述
func main() {
nums := []int{1, 2, 3, 4, 5, 6, 8, 9}
knuthShuffle(nums)
}
func knuthShuffle(nums []int) {
rand.Seed(time.Now().UnixNano())
for i := 0; i < len(nums); i++ {
r := rand.Intn(i+1)
nums[i], nums[r] = nums[r], nums[i]
}
}
Go库函数 rand.Shuffle
a := []int{1, 2, 3, 4, 5, 6, 7, 8}
rand.Seed(time.Now().UnixNano())
rand.Shuffle(len(a), func(i, j int) { a[i], a[j] = a[j], a[i] })
leetcode 384. 打乱数组
type Solution struct {
nums []int
origin []int
}
func Constructor(nums []int) Solution {
rand.Seed(time.Now().UnixNano())
tmp := make([]int, len(nums))
copy(tmp, nums)
return Solution{
nums: nums,
origin: tmp,
}
}
func (s *Solution) Reset() []int {
return s.origin
}
func (s *Solution) Shuffle() []int {
for i := 0; i < len(s.nums); i++ {
r := rand.Intn(i + 1)
s.nums[i], s.nums[r] = s.nums[r], s.nums[i]
}
return s.nums
}
func main() {
nums := []int{-9, 10, 100, 20}
solution := Constructor(nums)
reset := solution.Reset()
shuffle := solution.Shuffle()
s := solution.Shuffle()
fmt.Println(reset, shuffle, s)
}