首页 > 代码库 > 剑指Offer45 约瑟夫环
剑指Offer45 约瑟夫环
1 /************************************************************************* 2 > File Name: 45_LastNumberInCircle.cpp 3 > Author: Juntaran 4 > Mail: JuntaranMail@gmail.com 5 > Created Time: 2016年09月04日 星期日 20时21分57秒 6 ************************************************************************/ 7 8 #include <stdio.h> 9 #include <bits/stdc++.h> 10 11 using namespace std; 12 13 14 // 环形链表 15 int LastRemaining1(int n, int m) 16 { 17 if (n<1 || m<1) 18 return -1; 19 20 int i = 0; 21 22 list<int> numbers; 23 for (int i = 0; i < n; ++i) 24 numbers.push_back(i); 25 26 list<int>::iterator current = numbers.begin(); 27 while (numbers.size() > 1) 28 { 29 for (int i = 1; i < m; ++i) 30 { 31 current ++; 32 if (current == numbers.end()) 33 current = numbers.begin(); 34 } 35 list<int>::iterator next = ++current; 36 if (next == numbers.end()) 37 next = numbers.begin(); 38 39 --current; 40 numbers.erase(current); 41 current = next; 42 } 43 return *current; 44 } 45 46 // 数组模拟环 47 int LastRemaining2(int n, int m) 48 { 49 if (n<1 || m<1) 50 return -1; 51 52 int array[n]; 53 int i = -1; 54 int step = 0; 55 int count = n; 56 57 while (count > 0) 58 { 59 i ++; 60 if (i >= n) // 模拟环 61 i = 0; 62 if (array[i] == -1) 63 continue; 64 step ++; 65 if (step == m) 66 { 67 array[i] = -1; 68 step = 0; 69 count --; 70 } 71 } 72 int ret = i; 73 return ret; 74 } 75 76 // 数学解法 77 int LastRemaining3(int n, int m) 78 { 79 if (n<1 || m<1) 80 return -1; 81 82 int ret = 0; 83 for (int i = 2; i <= n; ++i) 84 ret = (ret + m) % i; 85 86 return ret; 87 } 88 89 int main() 90 { 91 int n = 100; 92 int m = 5; 93 94 int ret1 = LastRemaining1(n, m); 95 int ret2 = LastRemaining2(n, m); 96 int ret3 = LastRemaining3(n, m); 97 98 printf("ret1 is %d\n", ret1); 99 printf("ret2 is %d\n", ret2);100 printf("ret3 is %d\n", ret3);101 102 return 0;103 }
剑指Offer45 约瑟夫环
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。