LC记录二:丑数专题,一文秒解丑数3题

news2024/10/2 22:20:47

文章目录

  • 263.丑数1
  • 264.丑数2
  • 1201.丑数3

263.丑数1

https://leetcode.cn/problems/ugly-number/description/
在这里插入图片描述
简单题,丑数只包含质因子2、3、5。所以直接使用 n 循环 除 2 3 5最后判断结果是否等于1即可。
代码:

class Solution {
    public boolean isUgly(int n) {
        if (n <= 0) return false;
        while (n % 2 == 0) n /= 2;
        while (n % 3 == 0) n /= 3;
        while (n % 5 == 0) n /= 5;
        return n == 1;
    }
}

264.丑数2

https://leetcode.cn/problems/ugly-number-ii/description/
在这里插入图片描述
上一题的进阶版本:需要我们找出第n个丑数,我们首先需要明确的是,对于一个具体的丑数 m 来说,他可能对应的下面三个丑数分别为 2 * m,3 * m,5 * m。

  • 基于这个假设,我们创建一个数组 arr[n + 1] 其中arr[i] 表示的是第 i 个丑数。
  • 同时为了计算出下一个丑数,我们需要保存三个指针,twoIdx,threeIdx,fiveIdx分别代表的含义为,丑数序列中与2 3 5 分别想乘的丑数对应的arr 数组的下标。
  • 初始时,arr[1] = 1,表示第1个丑数为1。 twoIdx = 1,threeIdx = 1, fiveIdx = 1。此时为了计算第2 个丑数。我们可以如下计算:
    arr[2] = Math.min(arr[twoIdx] * 2, Math.min(arr[threeIdx] * 3, arr[fiveIdx] * 5)),计算出下一个最小的素数。同时计算完毕后,我们需要拿arr[2] 分别和 arr[twoIdx] * 2 、arr[threeIdx] * 3 、arr[fiveIdx] * 5对比,如果相等就更新下标,将对应下标 + 1,表示下一次质因子对应下一个质数。

具体参考代码示例:

class Solution {
    public int nthUglyNumber(int n) {
            int[] arr = new int[n + 1];
        arr[1] = 1;
        int twoIdx = 1, threeIdx = 1, fiveIdx = 1;
        for(int i = 2; i <= n; i++){
            int num = Math.min(arr[twoIdx] * 2, Math.min(arr[threeIdx] * 3, arr[fiveIdx] * 5));
            if(num == arr[twoIdx] * 2) ++twoIdx;
            if(num == arr[threeIdx] * 3)    ++threeIdx;
            if(num == arr[fiveIdx] * 5) ++fiveIdx;
            arr[i] = num;
        }
        return arr[n];
        }
}

1201.丑数3

https://leetcode.cn/problems/ugly-number-iii/
在这里插入图片描述
这个题目相当于是又一次升级版本,仍然是找出第n个丑数,但相对于上一题数据范围更大,我第一次仍然采用上一题思路,求解,最终通过了 43/53个测试用例。
在这里插入图片描述
参考题解解决:求解第n个质数,第n个质数一定包含n个质因子(与上面2道题目不同的地方是本题 1 不是质数)。所以我们需要做的就是求解一个数n,同时计算出他的质因子个数是否为n,如果是:说明我们找到了,如果不是需要采用二分的思路缩小搜索范围。
这个涉及到一个重复求解质因子的问题:互容原理:
参考:https://leetcode.cn/problems/ugly-number-iii/solutions/2003797/javac-rong-chi-yuan-li-er-fen-cha-zhao-b-bf69/
假设班里有10个学生喜欢数学, 15个学生喜欢语文, 21个学生喜欢编程,班里至少喜欢一门学科的有多少个学生呢?是10 + 15 + 21个吗?不是的,因为有些学生可能同时喜欢数学和语文,或者语文和编程,甚至还有可能三者都喜欢.

我们定义喜欢数学的学生为A集合,喜欢数学的学生为B集合,喜欢编程的为C集合。那么学生总数为∣A∪B∪C∣,如果直接将三个集合的个数相加即∣A∣+∣B∣+∣C∣会有重复个数,因此需要扣掉一些元素即∣A∩B∣,∣A∩C∣,∣B∩C∣,但是这时候我们发现∣A∩B∩C∣这部分又会被多扣一次,所以最后再加上这一部分。
∣A∪B∪C∣=∣A∣+∣B∣+∣C∣−∣A∩B∣−∣A∩C∣−∣B∩C∣+∣A∩B∩C∣
在这里插入图片描述

那么[1,i]中能够被a或b或c整除的数个数是否=i/a+i/b+i/c?,显然不等于,因为其中有些数即能被a,b和c整除。因此,我们要考虑如何去除重复计算的数。利用容斥原理,[1,i]中能被a或b或c整除的数的个数=i/a−i/b−i/c−i/ab−i/bc−i/ac+i/abc。其中i/ab代表能被a和b整除的数,其他同理。
如何利用以上信息计算答案呢?
题目需要返回第n个丑数,由于n很大,直接暴力求解显然不行。但是其实明白了上面的信息后,很容易就可以想到二分法来求解答案。
可以将题目转化为:在[1,i]中求解能被a或b或c整除的数个数之和大于等于n的最小的i即是我们的答案。

显然对于答案x来说,[1,x−1]必然是不满足要求,而[x,INF]都能够满足要求。那么就可以使用二分法来寻找这个问题的边界,左边界为1,右边界为无穷大。

代码参考:

class Solution {
    public int nthUglyNumber(int n, int a, int b, int c) {
        if(a == 1 || b == 1 || c == 1){
            return n;
        }
        long lcmab = lcm(a, b);
        long lcmac = lcm(a, c);
        long lcmbc = lcm(b, c);
        long lcmabc = lcm(lcmab, c);
        int min = Math.min(a, Math.min(b, c));
        long l = min, r = (long)Math.pow(min, n);
        while(l < r){
            long mid = l + (r - l) / 2;
            long count = mid / a + mid / b + mid / c - mid /lcmab - mid / lcmac - mid / lcmbc + mid / lcmabc;
            System.out.println("count:" + count + "mid :" + mid);
            if(n <= count){
                // 比如示例2:[6,8]区间有个数7此时7并不是质数
                r = mid;
            }else if(n > count){
                l = mid + 1;
            }
        }    
        return (int)(r);
    }
    // 最小公倍数
    public long lcm(long a, long b){
        return a * b / gcd(a, b);
    }
    // 最大公因数
    public long gcd(long a, long b){
        if(a == 0){
            return b;   
        }
        return gcd(b % a, a);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2185136.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

01_SQLite

文章目录 ** SQLite 存储各类和数据类型 **** SQLite 五种亲缘类型** SQLite 创建数据表删除数据表插入数据信息从数据表中获取数据&#xff0c;以结果表的形式返回数据&#xff08;结果集&#xff09;updatedistinctorder bygroup byhaving触发器删除一个触发器&#xff08;tr…

计网问答大题(期末复习)

计网总结笔记 概述 互联网的 2 个重要基本特点&#xff1a;连通性&#xff0c;资源共享 从互联网的工作方式上看&#xff0c;可以划分为两大块&#xff1a; •边缘部分&#xff1a; 由所有连接在互联网上的主机组成&#xff0c;由用户直接使用&#xff0c;用来进行通信&…

并查集【数据结构与算法】【C语言版-笔记】

目录 一、需求分析二、并查集三、代码实现3.1 Find函数3.2 Union函数3.3 优化13.4 终极优化2---压缩策略 一、需求分析 假设有n个互不相交的集合 ◼问题1&#xff1a;给定某个集合中的一个元素&#xff0c;查找该元素属于哪个集合&#xff1f; ◼问题2&#xff1a;如何合并两个…

建筑业挂靠行为的防范建议

在建筑行业中&#xff0c;挂靠行为的普遍存在给许多企业带来了法律风险和信誉风险。为了防范这些风险&#xff0c;企业需要采取一系列有效的措施。 一、加强资质管理 企业应当通过合法途径获取和提升自身的资质等级&#xff0c;避免因资质不足而产生挂靠的需求。加强资质管理是…

【半导体物理基础】第1章 半导体中的电子状态和能带,晶格结构,有效质量

目录 1.1 半导体晶格结构和结合性质 固体的种类 典型晶体 元素半导体 几种晶胞结构 晶向指数与晶面 半导体的晶体结构 金刚石结构 金刚石结构的结晶学原胞 硅、锗相关参数 硅、锗相关参数计算 闪锌矿结构 纤锌矿结构 氯化钠型结构 1.2 半导体中的电子状态和能带…

Study-Oracle-10-ORALCE19C-RAC集群搭建

一路走来,所有遇到的人,帮助过我的、伤害过我的都是朋友,没有一个是敌人。 ORACLE --RAC 搭建理念:准备工作要仔细,每个参数及配置都到仔细核对。环境准备完成后,剩下的就是图像化操作,没啥难度,所以图形化操作偷懒不续写了。 一、硬件信息及配套软件 1、硬件设置 RAC…

客厅落地台灯怎么摆放?五款客厅落地台灯款式分享

客厅落地台灯怎么摆放&#xff1f;客厅落地台灯是提升光线环境在室内光线质量的关键设备。但如果不慎购买到低质量的客厅落地台灯&#xff0c;可能会导致光线效果不佳&#xff0c;进而影响视力健康。因此&#xff0c;挑选一个可靠的品牌至关重要。那么&#xff0c;客厅落地台灯…

ubuntu 18.04 cuda 11.01 gpgpu-sim 裸机编译

1&#xff0c;环境 ubuntu 18.04 x86_64 cuda 11.01 gpgpu-sim master commit 90ec3399763d7c8512cfe7dc193473086c38ca38 2&#xff0c;预备环境 一个比较新的 ubuntu 18.04&#xff0c;为了迎合 cuda 11.01 的版本需求 安装如下软件&#xff1a; sudo apt-get instal…

Thinkphp/Laravel基于vue的的出版社书籍阅读管理系统

目录 技术栈和环境说明具体实现截图设计思路关键技术课题的重点和难点&#xff1a;框架介绍数据访问方式PHP核心代码部分展示代码目录结构解析系统测试详细视频演示源码获取 技术栈和环境说明 采用PHP语言开发&#xff0c;开发环境为phpstudy 开发工具notepad并使用MYSQL数据库…

netty之NettyClient半包粘包处理、编码解码处理、收发数据方式

前言 Netty开发中&#xff0c;客户端与服务端需要保持同样的&#xff1b;半包粘包处理&#xff0c;编码解码处理、收发数据方式&#xff0c;这样才能保证数据通信正常。在前面NettyServer的章节中我们也同样处理了&#xff1b;半包粘包、编码解码等&#xff0c;为此在本章节我们…

Pikichu-xss实验案例-通过xss获取cookie

原理图&#xff1a; pikachu提供了一个pkxss后台&#xff1b; 该后台可以把获得的cookie信息显示出来&#xff1b; 查看后端代码cookie.php&#xff1a;就是获取cookie信息&#xff0c;保存起来&#xff0c;然后重定向跳转到目标页面&#xff1b;修改最后从定向的ip&#xff0…

PTH 实验

1. 实验网络拓扑 kali: 192.168.72.128win2008: 192.168.135.129 192.168.72.139win7: 192.168.72.149win2012:(DC) 192.168.72.131 2. EXPLOIT 0x0. NTLM hash计算脚本 python3 -c import hashlib,binascii; print (binascii.hexlify(hashlib.new("md4", "…

基于51单片机的3路电压测量-proteus仿真

地址&#xff1a;https://pan.baidu.com/s/1PG2vzudc1QKHGSBfjPF0eQ 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52/AT89C51简介&#xff1a; AT89C52/AT89C51是一款经典的8位单片机&#xff0c;是意法半导体&#xff08;STMicroelectron…

Leecode热题100-84.柱状图中的最大矩形

给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 示例 1: 输入&#xff1a;heights [2,1,5,6,2,3] 输出&#xff1a;10 解释&#xff1a;最大的矩形为图…

SQL SERVER 从嫌弃存储到爱上存储过程我给存储过程开发了版本控制工具和远程调试功能...

优缺点 SQL SERVER 爱上存储过程我给存储过程开发了版本控制工具和远程调试功能 先说说 存储过程的优缺点吧存储过程的优点 提高执行效率&#xff1a;存储过程是预编译的&#xff0c;执行速度较快&#xff0c;减少了网络传输量。 减少开发工作量&#xff1a;存储过程可以将复杂…

删除GitHub仓库的fork依赖 (Delete fork dependency of a GitHub repository)

解除fork仓库依赖的原因 在 Fork 了一个仓库&#xff0c;进行了大量修改&#xff0c;导致与父仓库的功能差异很大。 在每次 Pull Request 的默认目标分支是父仓库&#xff0c;很容易就会 PR 到父仓库里。 Fork 的仓库被其他人提出贡献并使用了&#xff0c;但不能显示贡献者…

【Python报错已解决】TypeError: not enough arguments for format string

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

国庆普及模拟2总结

目录 题目链接&#xff1a; 官方题解&#xff1a; 概述&#xff1a; 总结反思&#xff1a; 题目 T1: 题目分析&#xff1a; 错误代码&#xff1a; 错因&#xff1a; &#xff21;&#xff23;代码&#xff1a; T2&#xff1a; 题目分析&#xff1a; 赛时代码&#xf…

【Nacos架构 原理】内核设计之Nacos通信通道

文章目录 Nacos通信通道 &#xff08;长链接&#xff09;现状背景场景分析配置服务 长链接核心诉求功能性诉求负载均衡连接生命周期 Nacos通信通道 &#xff08;长链接&#xff09; 现状背景 Nacos 1.X 版本 Config/Naming 模块各自的推送通道都是按照自己的设计模型来实现的…

链表OJ经典题目及思路总结(二)头结点

系列文章目录 链表OJ经典题目及思路总结&#xff08;一&#xff09;双指针 链表OJ经典题目及思路总结&#xff08;二&#xff09;头结点 文章目录 系列文章目录前言1.建立新链表1.1 移除链表元素 2.哨兵位的头结点2.1 链表分割2.2 合并两个有序链表 3.CV工程师总结 前言 对于…