golang约瑟夫环

这篇博客详细介绍了如何使用Golang解决约瑟夫环问题。提供了三种不同的实现方式,包括递推方法、模拟环剔除和标记法。递推方法的时间复杂度为O(n),而另外两种模拟方法的时间复杂度为O(n*m),但空间复杂度分别为O(n)。
摘要由CSDN通过智能技术生成

题目

约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3,1。

实现一

递推方法,推算出公式:f(n)=[f(n-1,m)+m]%m (n>1) 剑指offer 62题

  1. 时间复杂度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
}

实现二

模拟一个环, 直接剔出第一个人,然后再验证是否符合条件,不符合追加到环尾部.直到环中最后一个元素

  1. 时间复杂度O(n*m)
  2. 空间复杂度O(n)
//模拟一个环, 直接剔出第一个人,然后再验证是否符合条件,
// 不符合追加到环尾部.直到环中最后一个元素
func Jos2(number, index int) int {
	//处理边界
	if number < 0 || index < 0 {
		return -1
	}
	//申请一个切片,模拟一个环.一个位置一个人.
	people := make([]int, 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值