IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【剑指offer】圆圈中最后剩下的数字+构建乘积数组 -> 正文阅读

[数据结构与算法]【剑指offer】圆圈中最后剩下的数字+构建乘积数组

🔥题目

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

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

??解析

这个经典的问题叫做【约瑟夫环】。

弗拉维奥·约瑟夫是1世纪的一名犹太历史学家。他在自己的日记中写道,他和他的40个战友被罗马军队包围在洞中。他们讨论是自杀还是被俘,最终决定自杀,并以抽签的方式决定谁杀掉谁。约瑟夫斯和另外一个人是最后两个留下的人。约瑟夫斯说服了那个人,他们将向罗马军队投降,不再自杀。约瑟夫斯把他的存活归因于运气或天意,他不知道是哪一个。

我们当然可以建立一个循环链表进行模拟,但约瑟夫问题可以在时间O(n)、空间O(1)内解决。

此时有n个人,每次杀掉第m个人,从第0个人开始杀。游戏开始。

游戏开始时,设约瑟夫问题的解为 f(n, m) + 0

杀掉第一个人后,约瑟夫问题的解变为 [f(n - 1, m) + m % n] % n ,即 [f(n - 1, m) + m] % n

依此可以递推,直到 f(1, m) = 0

所以,我们可以自底向上线性的构建出这个答案(如下面的代码)。

🧊代码

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

🌸补充

妙哉妙哉!

?
?
?
?
?

🔥题目

给定一个数组 A[0,1,…,n-1],请构建一个数组 B[0,1,…,n-1],其中 B[i] 的值是数组 A 中除了下标 i 以外的元素的积, 即 B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]

规定:不能使用除法。

输入:[1, 2, 3, 4, 5]
输出:[120, 60, 40, 30, 24]

??解析

最朴素的思路是先求出数组中所有元素的积,然后遍历所有位置,总乘积除以当前位置的值。

可惜,题目不允许我们使用除法。

所以,我们使用 前缀积 的思路,它的原理和 前缀和 类似。

举个例子就能轻易理解这个思路:

A[]12345
前缀积(不包括自己)112624
后缀积(不包括自己)120602051
B[]12060403024

🧊代码

class Solution {
    public int[] constructArr(int[] A) {
        int len = A.length;
        int[] B = new int[len];
        int L = 1;
        int R = 1;
        // 前缀积(不包括自己)
        for (int i = 0; i < len; i++) {
            B[i] = L;
            L *= A[i];
        }
        // 后缀积(不包括自己)
        for (int i = len - 1; i >= 0; i--) {
            B[i] *= R;
            R *= A[i];
        }
        return B;
    }
}

🌸补充

妙哉妙哉!

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-10 23:11:46  更:2021-08-10 23:12:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/28 17:05:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计