题目:

n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始, 
每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。 
当一个数字删除后,从被删除数字的下一个继续删除第m个数字。 
求出在这个圆圈中剩下的最后一个数字。

我的思路:

这是个很经典的环形问题,最优的方案时间复杂度是O(n):先构建递推公式,再使用循环或者递归都能轻松求解,

网上的教程很少能把这个递推公式的由来描述清楚,所以我在这里加入我的一些理解。

由于我们要求解的是n个元素,第m个数字,要找到最后的一个数字,那么我在这里假设得到的结果是f(n,m),

假设我们已有数列为:

0    1    ...  m-2    m-1  m  ...     n-1

删除一次后得到的新数列是(注意题目条件->从被删除数字的下一个继续删除):

m    m+1   ...   n-1     0    1    ...    m-2   ①

很显然,通过一次删除后,问题规模从n变成了n-1,而f(n-1,m)所要求解的数列是:

0    1    ...  m-2    m-1  m  ...     n-2 ②

很显然,把数列②向左移动m就变成了①的解(注意①和②不完全相同,但是我们想要求的是第一个值,因为第一个值是删除后剩下的数字),

考虑到“左加右减”的数学原理和环形的特征,得到递推公式:

0                          if n==1

f(n,m)={

(f(n-1,m)+m)%n    if  n>1

那么也就不难得到如下代码:

int LastNumberOfCircle(int n, int m)
{
int last = ;
for(int i=;i<=n;++i)
{
last = (last+m)%i;
}
return last;
}

最新文章

  1. Promise的前世今生和妙用技巧
  2. codeforces 424D
  3. ExtJs 可查询的下拉框
  4. .NET生成word文档服务器配置常见问题
  5. 图解Windows Server 2012 桌面图标
  6. ACM2055_ctype.h_cctype
  7. appium新版本不支持findElementByName,切换到findElementByAndroidUIAutomator
  8. The 4th tip of DB Query Analyzer
  9. paip.c++ qt 项目工程互相引用的方法
  10. LOJ_6045_「雅礼集训 2017 Day8」价 _最小割
  11. win10 anaconda+tensorflow+keras
  12. .NET开发人员遇到Maven
  13. 在IDEA里创建web项目,以及web 项目部署
  14. ICP点云配准原理及优化
  15. PHP实现无符号右移(js中的 &gt;&gt;&gt;)
  16. 【转】如何使用BehaviorSDK
  17. MySQL监控、性能分析——工具篇
  18. 原生javascript实现分页效果+搜索功能
  19. Python接口测试实战2 - 使用Python发送请求
  20. js验证汉字正则表达式

热门文章

  1. print显示特定的数据格式
  2. CSS--overflow和hover
  3. NATS_08:NATS客户端Go语言手动编写
  4. python——type()、metaclass元类和精简ORM框架
  5. 防止jquery ajax 重复提交
  6. tomcat启动时,内存溢出,Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread &quot;main&quot;
  7. Nginx跳转Tomcat
  8. psutil-3.4.2才是我的老系统(Windows XP)的菜
  9. bzoj 5085: 最大——结论题qwq
  10. 一次非线上iowait高的情况的检查