剑指 Offer 62. 圆圈中最后剩下的数字 <约瑟夫环>

2023-10-30

看了诸多大神的解题还是有点不明白,故记录一下。
如题:
0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个数字。

方法一:递归

//数学 + 递归
class Solution {
    public int lastRemaining(int n, int m) {
        return f(n, m);
    }
    public int f(int n, int m) {
        if (n == 1) {
            return 0;
        }
        int x = f(n - 1, m);
        return (x + m) % n;
    }
}

当 n==1时,最后留下数字的编号一定是0。
当知道f( n - 1)的值时,便可以通过计算得到f(n)的值,已知f(1) = 0;
故可以通过递归的办法。
令f( n - 1)的值为 x,当知道f(n-1,m)的值为x时,f(n, m)的编号即为x往后数(m%n)个的数。

方法二:迭代

下标 0 1 2 3 4
数字 0 1 2 3 4

[5,3]问题---------[i,3] 每一轮i都在变化 ,结合上面递归所得公式 (x + m) % n可以推出;
[1,3] 剩下一个数3-----------------故下标为0
[2,3] 第四轮删除1------------------1 3
[3,3] 第三轮删除4------------------1 3 4
[4,3] 第二轮删除0------------------ 3 4 0 1
[5,3] 第一轮删除2------------------0 1 2 3 4
反向推出3在之前每个轮次的位置
下标为 (0 + 3) % 2 = 1
下标为 (1 + 3) % 3 = 1
下标为 (1 + 3) % 4 = 0
下标为 (0 + 3) % 5 = 3
最终剩下的数字的下标就是3。因为数组是从0开始的,所以最终的答案就是3

class Solution {
    public int lastRemaining(int n, int m) {
        int x = 0;
        for (int i = 2; i <= n; i++) {
            x = (x + m) % i;
        }
        return x;
    }
}

题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/yuan-quan-zhong-zui-hou-sheng-xia-de-shu-zi-lcof

参考:
https://leetcode-cn.com/problems/yuan-quan-zhong-zui-hou-sheng-xia-de-shu-zi-lcof/solution/jian-zhi-offer-62-yuan-quan-zhong-zui-ho-dcow/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

剑指 Offer 62. 圆圈中最后剩下的数字 <约瑟夫环> 的相关文章

  • 如何使用JSmooth软件将java文件打包发布成exe文件,在没有jre环境的机子上运行(亲测有用)

    使用JSmooth将Java应用程序转化为 exe windows可运行程序 昨天帮一位非从事软件的同学写了个计算小程序 第一次使用JSmooth软件将Java程序转换成 exe文件 在其没有JRE的电脑上成功运行 由于是第一次倒腾 所以花
  • java基础(JDK,JRE,JVM,API,注释,dos命令)

    1 计算机编程语言 第一代 机器语言 相当于人类的石器时代 第二代 汇编语言 相当于人类的青铜 铁器时代 第三代 高级语言 相当于人类的信息时代 2 JDK JRE JDK Java Development Kit 是Java程序开发工具包
  • 快速找到某台电脑上tomcat的安装路径

    所有程序 gt Apache Tomcat 7 0 Tomcat7 gt Tomcat 7 0 Program Directory 即可 当然前提是他的是window安装版
  • java基本语法 上

    目录 关键字与保留字 关键字 keyword 的定义和特点 保留字 标识符 Java中的名称命名规范 变量 变量的定义 变量的分类 整数类型 byte short int long 浮点类型 float double 字符类型 char 布
  • 狂神。SMBMS(超市订单管理系统)

    SMBMS 超市订单管理系统 代码 建议把静态资源和sql拿过来用 其他自己写一遍练手 注意修改相关配置文件 链接 https pan baidu com s 12MmpF9msJVjLT1U77XYfRw 提取码 11fv 数据库 项目如
  • Java创建多线程的五种写法

    目录 一 lambda表达式 强烈推荐 最简单 基础格式 举例 运行结果 二 继承 Thread 重写 run 基础格式 举例 运行结果 三 实现 Runnable 重写 run 基础格式 举例 运行结果 四 使用匿名内部类 继承 Thre
  • 【java学习】String字符串

    1 概念 1 String 不可变 不可变类 final 不可被继承 public final class String implements java io Serializable Comparable
  • 哈希表(散列表)详解

    今天的每一秒都是珍贵的 因为它永远不会再次出现 作者 不能再留遗憾了 专栏 Java学习 本文章主要内容 深入理解哈希表 散列表 散列函数的几种构造方法以及解决哈希冲突的方法 文章目录 前言 什么是哈希表 哈希表相对于其他的查找结构有什么优
  • java连接mysql数据库(3)插入数据,详细

    连接数据库并向表中插入数据 代码 public class today public static void main String args String url jdbc mysql localhost 3306 my url是固定的
  • leetcode刷题(5)

    各位朋友们 大家好 今天是我leedcode刷题的第五篇 我们一起来看看吧 文章目录 栈的压入 弹出序列 题目要求 用例输入 提示 做题思路 代码实现 C语言代码实现 Java代码实现 最小栈 题目要求 用例输入 提示 做题思路 代码实现
  • Java中的栈区和堆区问题(关于数组)

    Java中创建的局部变量等是存放在栈区的 而数组是存放在堆区的 那些new出来的对象也大多存放于堆区 栈区的空间往往不大 而堆区空间就会大很多 这里我们创建一个数组 如果在idea中打印a 会得到一串符号 这个是数组在堆区首元素的地址 代表
  • 解决jar包启动关闭窗口后停止项目问题

    项目以jar形式部署到服务器 通常会以这样的形式 java jar zpw 2 2 5 RELEASE jar 问题 当我们一关闭当前窗口就会停止运行项目 解决思路 在后台运行 解决方法 nohup java jar zpw 2 2 5 R
  • 内存溢出问题解决思路

    内存溢出问题解决 一 常规解决思路 首先 在JVM参数配置时需要配置内存溢出后dump出内存的快照来 配置如下 XX HeapDumpOnOutOfMemoryError XX HeapDumpPath 内存快照 hprof输出路径 然后
  • Java练习代码(五)- 线程

    package Java2021 4 8 import sun util resources ms CalendarData ms MY Create with IntelliJ IDEA Description Auther HMW Da
  • List接口不是很详细的介绍

    文章目录 前言 一 List是什么 1 1 List概述 1 2 常用API 带有Index 都是List新增方法 1 3 List用法 二 常见实用类 2 1 ArrayList与Vector 2 2 ArrayList与LinkedLi
  • 数据库的用户信息表设计

    用户信息表在很多情况下都需要有 属于一个项目开篇的基础 这个不搞好以后就会给自己带来麻烦 我参考该博文设计 浅谈数据库用户表结构设计 只是有些地方我实践之后需要补充一下 user表字段 user auth表 要补充说明的是 nickname
  • 关于ArithmeticException 异常捕获(double类型的数据除于0为什么是无穷大?)

    关于ArithmeticException 异常捕获 double类型的数据除于0为什么是无穷大 在做实验编写应用程序 从命令行中输入表示两个小数的参数的字符串 求它们的商 要求程序捕获NumberFormatException异常和Ari
  • JSP 弹出框 子页面给父页面回传参数

    做一个jsp的页面 然后又弹出一个对话框 并且把输入框的值返回到文本中 具体代码如下 1 父页面 写道
  • IDEA卡顿怎么办?快来用用这个办法

    IDEA卡顿解决方法 亲测有效 1 找到IDEA安装位置 打开这两个配置 2 修改配置 3 保存配置 重启IDEA 先介绍一下我电脑的情况 华硕dx80 8g运行 电脑配置一般 在跟同等价位的拯救者同时打开IDEA时 打开速度都差好多 为了
  • 下载Eclipse IDE

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 一 下载eclipse 二 安装语言包 一 下载eclipse Eclipse是一个开放源代码的 基于Java的可扩展开发平台 官方网站是https www ecl

随机推荐