标签:1832 小伙伴 游戏 int winner 获胜者 LeeCode 顺时针
LeeCode 1832
题目描述:
共有 n 名小伙伴一起做游戏。小伙伴围成一圈,按顺时针顺序从1到n编号。确切地说,从第 i 名小伙伴顺时针移动一位会到达第 (i+1) 名小伙伴的位置,其中 1 <= i < n,从第 n 名小伙伴顺时针移动一位会回到第 1 名小伙伴的位置。
游戏遵顼如下规则:
- 从第 1 名小伙伴所在位置开始
- 沿着顺时针方向数 k 名小伙伴,计数时需要包含起始时位置的那位小伙伴。逐个绕圈进行计数,一些小伙伴可能会被数过不止一次
- 你数到的最后一名小伙伴需要离开圈子,并视作输掉游戏
- 如果圈子中仍然有不止一名小伙伴,从刚刚输掉的小伙伴的顺时针下一位小伙伴开始,回到步骤2继续执行
- 否则,圈子中最后一名小伙伴赢得游戏
给你参与游戏的小伙伴总数 n,和一个整数k,返回游戏的获胜者
标签: 动态规划、约瑟夫环
建立模型
- 假设当前有 n 个人,位置为 k 的小伙伴退出游戏
- 观察下标变化
# 1 -> n-k+1
# 2 -> n-k+2
# ...
# k -> 退出游戏
# k+1 -> 1
# k+2 -> 2
# ...
# n -> n-k
由上面的规律可以得到这样一个关系式:
\[f(n) = (f(n - 1) + k - 1) \% n + 1 \]编码实现
def findTheWinner(n: int, k: int) -> int:
# 初始状态, n=1时获胜者就是该小伙伴
winner = 1
for i in range(2, n+1):
winner = (winner + k - 1) % n + 1 # 状态转移方程
return winner
标签:1832,小伙伴,游戏,int,winner,获胜者,LeeCode,顺时针 来源: https://www.cnblogs.com/ylyzty/p/16221335.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。