62. 圆圈中最后剩下的数字

news/2024/12/23 1:14:04/

comments: true
difficulty: 简单
edit_url: https://github.com/doocs/leetcode/edit/main/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9862.%20%E5%9C%86%E5%9C%88%E4%B8%AD%E6%9C%80%E5%90%8E%E5%89%A9%E4%B8%8B%E7%9A%84%E6%95%B0%E5%AD%97/README.md

面试题 62. 圆圈中最后剩下的数字

题目描述

0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个数字。

例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。

示例 1:

输入: n = 5, m = 3
输出: 3

示例 2:

输入: n = 10, m = 17
输出: 2

限制:

  • 1 <= n <= 10^5
  • 1 <= m <= 10^6

解法

方法一:数学 + 递归(迭代)

我们不妨设 f ( n , m ) f(n, m) f(n,m) 表示从 n n n 个数中每次删除第 m m m 个,最后剩下的是第几个数字。

我们第一次删除了第 m m m 个数字,剩下 n − 1 n-1 n1 个数,那么 x = f ( n − 1 , m ) x=f(n - 1, m) x=f(n1,m) 就表示从剩下的 n − 1 n-1 n1 个数中,每次删除第 m m m 个,最后剩下的是第几个数字。

我们求得 x x x 之后,便可以知道 f ( n , m ) f(n, m) f(n,m) 应该是从 m % n m \% n m%n 开始数的第 x x x 个元素,即 f ( n , m ) = ( m % n + x ) % n f(n, m) = (m \% n + x) \% n f(n,m)=(m%n+x)%n

n n n 1 1 1 时,最后留下的数字序号一定为 0 0 0

递归求解即可,也可以改成迭代。

时间复杂度 O ( n ) O(n) O(n),递归的空间复杂度 O ( n ) O(n) O(n),迭代的空间复杂度 O ( 1 ) O(1) O(1)

题解:https://www.acwing.com/video/205/
在这里插入图片描述

Python3
class Solution:def lastRemaining(self, n: int, m: int) -> int:def f(n, m):if n == 1:return 0return (f(n - 1, m) + m) % nreturn f(n, m)
Java
class Solution {public int lastRemaining(int n, int m) {return f(n, m);}private int f(int n, int m) {if (n == 1) {return 0;}int x = f(n - 1, m);return (m + x) % n;}
}
C++
class Solution {
public:int lastRemaining(int n, int m) {return f(n, m);}int f(int n, int m) {if (n == 1) {return 0;}int x = f(n - 1, m);return (m + x) % n;}
};
Go
func lastRemaining(n int, m int) int {var f func(n, m int) intf = func(n, m int) int {if n == 1 {return 0}x := f(n-1, m)return (m + x) % n}return f(n, m)
}
JavaScript
/*** @param {number} n* @param {number} m* @return {number}*/
var lastRemaining = function (n, m) {let f = 0;for (let i = 2; i <= n; ++i) {f = (f + m) % i;}return f;
};
C#
public class Solution {public int LastRemaining(int n, int m) {int f = 0;for (int i = 2; i < n + 1; i++) {f = (f + m) % i;}return f;}
}
Swift
class Solution {func lastRemaining(_ n: Int, _ m: Int) -> Int {return f(n, m)}private func f(_ n: Int, _ m: Int) -> Int {if n == 1 {return 0}let x = f(n - 1, m)return (m + x) % n}
}

方法二

Python3
class Solution:def lastRemaining(self, n: int, m: int) -> int:f = 0for i in range(2, n + 1):f = (f + m) % ireturn f
Java
class Solution {public int lastRemaining(int n, int m) {int f = 0;for (int i = 2; i <= n; ++i) {f = (f + m) % i;}return f;}
}
C++
class Solution {
public:int lastRemaining(int n, int m) {int f = 0;for (int i = 2; i <= n; ++i) {f = (f + m) % i;}return f;}
};
Go
func lastRemaining(n int, m int) int {f := 0for i := 2; i <= n; i++ {f = (f + m) % i}return f
}

http://www.ppmy.cn/news/1527224.html

相关文章

硬件工程师笔试面试学习汇总——器件篇目录

目录 一、器件篇目录 1、电阻(Resistors) 1.1、 基础 1.2、相关问题 1.3、上拉电阻 1.4、下拉电阻 2、电容(Capacitors) 2.1、基础 2.2、相关问题 3、电感(Inductors) 3.1、基础 3.2、相关问题 4、二极管(Diodes) 4.1、基础 4.2、相关问题 5、三极管 5.1…

PostgreSQL的walsender和walreceiver进程介绍

PostgreSQL的walsender和walreceiver进程介绍 在 PostgreSQL 中&#xff0c;WAL (Write-Ahead Logging) 是一种用于确保数据库事务日志安全可靠的机制。WAL 是 PostgreSQL 进行数据库恢复、复制等操作的基础。walsender 和 walreceiver 是 PostgreSQL 内部两个非常重要的进程&…

unity UnityWebRequest 的request.downloadHandler 空应用

unity UnityWebRequest 的request.downloadHandler 空应用 private IEnumerator Test_Get() {UnityWebRequest request new UnityWebRequest(tmp_getURL, "GET");yield return request.SendWebRequest();if (request.result UnityWebRequest.Result.ConnectionErr…

用于稀疏自适应深度细化的掩码空间传播网络 CVPR2024

目录 Masked Spatial Propagation Network for Sparsity-Adaptive Depth Refinement &#xff08;CVPR 2024&#xff09;用于稀疏自适应深度细化的掩码空间传播网络1 介绍2 算法流程2.1 问题建模2.2 Guidance Network2.3 MSPN 模块 3 实验结果3.1 稀疏度自适应深度细化对比试验…

基于微信小程序的图书馆预约占座系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 基于微信小程序JavaSpringBootVueMySQL的图…

目标检测基本知识

目标检测 一、目标检测二、常用的评价指标2.1 IOU2.2 NMS(非极大值抑制) 三、R-CNN网络基础3.1 Overfeat模型3.2 RCNN模型3.3FastRCNN模型 四、Faster-RCNN网络4.1 网络工作流程 五、yolo系列5.1 yoloV3 六、SSD算法 一、目标检测 目标检测的任务是找出图像中所有感兴趣的目标…

Java项目实战II基于Java+Spring Boot+MySQL的图书管理系统的设计与实现 (源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、论文参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在信息爆炸…

C++:初始化列表

构造函数在上一篇帖子我们提到了对成员变量初始化的功能&#xff0c;出了在构造函数的函数体中队成员变量一个一个赋值以外&#xff0c;我们还可以采用初始化列表。 #include<iostream> using namespace std;class AA { private:int a;const int b; public:AA():b(200),…