剑指Offer - 面试题62. 圆圈中最后剩下的数字(约瑟夫环 递推公式)
1. 題目
0,1,…,n-1這n個(gè)數(shù)字排成一個(gè)圓圈,從數(shù)字0開(kāi)始,每次從這個(gè)圓圈里刪除第m個(gè)數(shù)字。求出這個(gè)圓圈里剩下的最后一個(gè)數(shù)字。
例如,0、1、2、3、4這5個(gè)數(shù)字組成一個(gè)圓圈,從數(shù)字0開(kāi)始每次刪除第3個(gè)數(shù)字,則刪除的前4個(gè)數(shù)字依次是2、0、4、1,因此最后剩下的數(shù)字是3。
示例 1: 輸入: n = 5, m = 3 輸出: 3示例 2: 輸入: n = 10, m = 17 輸出: 2限制: 1 <= n <= 10^5 1 <= m <= 10^6來(lái)源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/yuan-quan-zhong-zui-hou-sheng-xia-de-shu-zi-lcof
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。
還有 5727. 找出游戲的獲勝者 https://leetcode-cn.com/problems/find-the-winner-of-the-circular-game/
我的博客 鏈表: 約瑟夫環(huán)問(wèn)題
2. 解題
類似題目:LeetCode 390. 消除游戲(類似約瑟夫環(huán),找映射規(guī)律)
2.1 數(shù)組模擬超時(shí)
極限數(shù)據(jù)下,超時(shí)了
class Solution { public:int lastRemaining(int n, int m) {vector<int> num(n);int i;for(i = 0; i < n; i++)num[i] = i;i = 0;while(num.size() != 1){i = (i+m-1)%num.size();num.erase(num.begin()+i);//不斷的刪除}return num[0];} };2.2 公式法
參考別人的解法
- f(people,num)f(people,num)f(people,num) 表示在有people個(gè)人時(shí),報(bào)數(shù)為num,勝利的人的位置
- people = 1 時(shí), pos = 0
- pos=f(people,num)=(f(people?1,num)+num)%peoplepos = f(people,num) = (f(people-1,num)+num)\% peoplepos=f(people,num)=(f(people?1,num)+num)%people
總結(jié)
以上是生活随笔為你收集整理的剑指Offer - 面试题62. 圆圈中最后剩下的数字(约瑟夫环 递推公式)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: LeetCode 43. 字符串相乘(大
- 下一篇: 程序员面试金典 - 面试题 01.08.