题目
约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3,1。
实现一
递推方法,推算出公式:f(n)=[f(n-1,m)+m]%m (n>1) 剑指offer 62题
- 时间复杂度O(n)
func Jos(number, index int) int {
//处理边界
if number < 0 || index < 0 {
return -1
}
last := 0
for i := 2; i <= number; i ++ {
last = (last + index) % i
}
return last+1
}
实现二
模拟一个环, 直接剔出第一个人,然后再验证是否符合条件,不符合追加到环尾部.直到环中最后一个元素
- 时间复杂度O(n*m)
- 空间复杂度O(n)
//模拟一个环, 直接剔出第一个人,然后再验证是否符合条件,
// 不符合追加到环尾部.直到环中最后一个元素
func Jos2(number, index int) int {
//处理边界
if number < 0 || index < 0 {
return -1
}
//申请一个切片,模拟一个环.一个位置一个人.
people := make([]int,