剑指 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. 圆圈中最后剩下的数字 <约瑟夫环> 的相关文章

  • Java学习----习题总结

    今日习题总结如下 TCP IP分层协议栈 TCP IP协议栈参考模型分为五个层次 应用层 传输层 网络层 链路层和物理层 应用层 是网络应用程序及其应用层协议存留的层次 该层包括了所有与网络相关的高层协议 如文件传输协议 FTP 超文本传输
  • Jdk下载和安装

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 下载JDK 二 安装JDK 三 配置环境 四 检验安装 前言 学习java第一步 写java文件都需要配置java环境 提示 以下是本篇文章正文内容 下面
  • 【Hbuilder+vue项目学习】新项目初建

    下载uView空白模板 下载包中的内容 导入在Hbuilder X中导入项目即可创建成功 在gitee上管理项目 填写好名称 介绍等信息 点击创建即可 点击HbuilderX下的终端图标 进行上传项目操作 emmm终端一片空白 用不了 网上
  • 关于String的hashcode,以及判断字符串是否相等的解析

    跟着老师的方法验证equals方法的重写 由于误写发现运行结果和预想的不一样 先上代码 package com wuyw oo import java util Objects author wuyw2020 date 2019 10 28
  • 哈希表(散列表)详解

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

    所谓的基于对象语言 指的是在程序的内部已经为用户提供好若干个对象 用户直接使用这些对象即可 如 javascript
  • Java Long类型的查询结果与前端TypeScript显示不一致,后端传值与前端对不上,出现精度损失

    自己折腾了一个项目 使用的技术是SpringBoot MP Vben admin MySql 今天瞎搞的时候发现了一个让我很懵逼的问题 如下图所示 上方是浏览器打印出来的log 下方是数据库实际存在的数据 或者也可以说是后台接口断点调试的数
  • HashMap的使用

    put方法 Hashmap的put方法放值 可以单次向HashMap中添加一个键值对 没有顺序 HashMap
  • java中的基本数据类型和引用数据类型以及它们的存储方式堆内存和栈内存

    一直对java中的基本数据类型和引用数据类型之间的关系搞不太清楚 今天做leetcode的一道题目 总算弄清楚了关系 写下来和大家一起分享一下 一 基本数据类型 数据类型在计算机语言里面 是对内存位置的一个抽象表达方式 可以理解为针对内存的
  • 外卖点餐系统

    傻瓜式外卖点餐系统 无数据库 tips 菜品类 菜品id 菜品名 菜品类型 上架时间 单价 月销售 总数量 管理员类 管理员id 账号 密码 客户类 客户id 客户名 性别 密码 送餐地址 手机号 创建时间 订单类 订单号 订单创建时间 菜
  • Java练习代码(五)- 线程

    package Java2021 4 8 import sun util resources ms CalendarData ms MY Create with IntelliJ IDEA Description Auther HMW Da
  • Java可变参数Object... args

    文章目录 引言 一 方法重载 二 Object args 三 Object args 3 1 定义 3 2 调用 3 3 处理 3 4 传参 3 5 泛型 3 6 重载 参考 引言 因为Java要求实参 Arguments 和形参 Para
  • 蓝桥杯有必要参赛吗?

    昨天和群里的小伙伴在群里聊 有的小伙伴竟然说蓝桥杯一等奖没有含量 我也是醉了 就像去年看了一个号主写的 研究生遍地都是 放眼全国14亿人口 别说研究生了 本科生占比有多少 蓝桥杯是我人生中得到的第一个大奖 在蓝桥杯大赛备赛期间 我学到了很多
  • java Fileread用法及注意事项

    关于其创建 还有注意事项 package IOtest test1 import org junit Test import java io File import java io FileReader import java io IOE
  • Java JDBC连接数据库 查询SELECT

    package com edu import java sql public class jdbctest public static void main String args throws SQLException ClassNotFo
  • 作为 Java初学者,刚学完JavaSE,有什么可以做的项目吗

    文章目录 一 基于面向对象开发的黑框程序 1 1 开发工具 1 2 至少掌握这些 1 3 推荐做的项目 二 Java SE 桌面窗体小程序 基本可以忽略 三 Java SE 高级应用 四 下节预告 Author Gorit Date 202
  • java多线程:线程池和阻塞队列

    一 线程池定义和使用 jdk 1 5 之后就引入了线程池 1 1 定义 从上面的空间切换看得出来 线程是稀缺资源 它的创建与销毁是一个相对偏重且耗资源的操作 而Java线程依赖于内核线程 创建线程需要进行操作系统状态切换 为避免资源过度消耗
  • JSP 弹出框 子页面给父页面回传参数

    做一个jsp的页面 然后又弹出一个对话框 并且把输入框的值返回到文本中 具体代码如下 1 父页面 写道
  • Java开发工具

    文章目录 一 Sublime Text 二 IDEA 一 Sublime Text 官网 Sublime Text 说明 文本编辑器 适合初学者练习手写代码 特点 支持多行编辑 二 IDEA
  • 1005. K 次取反后最大化的数组和 && 增强for循环(foreach循环)遍历数组

    1005 K 次取反后最大化的数组和 原题链接 完成情况 解题思路 参考代码 1005K次取反后最大化的数组和 1005K次取反后最大化的数组和 简洁写法 错误经验吸取 增强for循环 foreach循环 遍历数

随机推荐