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

文章目录

  • 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.rhkb.cn/news/437233.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java中的顺序控制、分支控制、嵌套分支if-else

if-else 顺序控制分支控制if-else单分支1.基本语法2.说明&#xff1a;3.案例说明4.流程图 双分支1.基本语法2.说明&#xff1a;3.案例说明4.流程图5.练习 多分支1.基本语法2.说明&#xff1a;3.流程图4.练习 嵌套分支1.基本介绍2.基本语法3.练习 顺序控制 1.介绍&#xff1a;程…

AntFlow-Vue3 :一个仿钉钉流程审批,且满足99.8%以上审批流程需求的企业级工作流平台,开源且免费!

在现代企业管理中&#xff0c;流程审批的高效性直接影响到工作的流畅度与生产力。最近&#xff0c;我发现了一个非常有趣的项目—— AntFlow-Vue3 。这个项目不仅提供了一个灵活且可定制的工作流平台&#xff0c;还能让用户以可视化的方式创建和管理审批流程。 如果你是一名前…

【Android 13源码分析】Activity生命周期之onCreate,onStart,onResume-1

忽然有一天&#xff0c;我想要做一件事&#xff1a;去代码中去验证那些曾经被“灌输”的理论。                                                                                  – 服装…

【Java 集合】List接口 —— ArrayList 与 LinkedList 详解

List接口继承自Collection接口&#xff0c;是单列集合的一个重要分支。 在List集合中允许出现重复的元素&#xff0c;所有的元素是以一种线性方式进行存储的&#xff0c;在程序中可以通过索引&#xff08;类似于数组中的元素角标&#xff09;来访问集合中的指定元素。另外&…

ESP32 Bluedroid 篇(1)—— ibeacon 广播

前言 前面我们已经了解了 ESP32 的 BLE 整体架构&#xff0c;现在我们开始实际学习一下Bluedroid 从机篇的广播和扫描。本文将会以 ble_ibeacon demo 为例子进行讲解&#xff0c;需要注意的一点是。ibeacon 分为两个部分&#xff0c;一个是作为广播者&#xff0c;一个是作为观…

时序数据库 TDengine 的入门体验和操作记录

时序数据库 TDengine 的学习和使用经验 什么是 TDengine &#xff1f;什么是时序数据 &#xff1f;使用RPM安装包部署默认的网络端口 TDengine 使用TDengine 命令行&#xff08;CLI&#xff09;taosBenchmark服务器内存需求删库跑路测试 使用体验文档纠错 什么是 TDengine &…

【框架篇】过滤器和拦截器的区别以及使用场景

在项目开发中&#xff0c;常常会同时配置拦截器&#xff08;Interceptor&#xff09;和过滤器&#xff08;Filter&#xff09;&#xff0c;以下就是它们两个主要的区别&#xff1a; 过滤器&#xff08;Filter&#xff09; 配置和实现 Filter的实现还是很简单的&#xff0c;可…

【Python语言初识(六)】

一、网络编程入门 1.1、TCP/IP模型 实现网络通信的基础是网络通信协议&#xff0c;这些协议通常是由互联网工程任务组 &#xff08;IETF&#xff09;制定的。所谓“协议”就是通信计算机双方必须共同遵从的一组约定&#xff0c;例如怎样建立连接、怎样互相识别等&#xff0c;…

k8s搭建一主三从的mysql8集群---无坑

一&#xff0c;环境准备 1.1 k8s集群服务器 ip角色系统主机名cpumem192.168.40.129mastercentos7.9k8smaster48192.168.40.130node1centos7.9k8snode148192.168.40.131node2centos7.9k8snode248192.168.40.132node3centos7.9k8snode348 k8s集群操作请参考《K8s安装部署&…

力扣(leetcode)每日一题 1845 座位预约管理系统| treeSet和priority Queue的区别|线段树

之前发过一篇&#xff0c;感觉还有深挖的地方&#xff0c;于是又补充一些信息 这题目虽然是middle难度题目&#xff0c;要解答出来是只要easy的时间&#xff0c;但是深挖可以有hard的难度 题解1 可以帮助复习线段树的使用&#xff0c;题解2 可以复习一下java基础知识 题解1 线…

Springboot使用redis,以及解决redis缓存穿透,击穿,雪崩等问题

1.Redis面试题-缓存穿透,缓存击穿,缓存雪崩 1 穿透: 两边都不存在&#xff08;皇帝的新装&#xff09; &#xff08;返回空值&#xff09;&#xff08;互斥锁&#xff09;&#xff08;黑名单&#xff09; &#xff08;布隆过滤器&#xff09; 2 击穿&#xff1a;一个或多个热…

Kotlin:1.8.0 的新特性

一、概述 Kotlin 1.8.0版本英语官方文档 Kotlin 1.8.0 中文官方文档 The Kotlin 1.8.0 release is out and here are some of its biggest highlights: Kotlin 1.8.0发布了&#xff0c;下面是它的一些亮点: JVM 平台新增实验性函数&#xff1a;递归复制或删除目录内容改进了 …

9--苍穹外卖-SpringBoot项目中Redis的介绍及其使用实例 详解

目录 Redis入门 Redis简介 Redis服务启动与停止 服务启动命令 Redis数据类型 5种常用数据类型介绍 各种数据类型的特点 Redis常用命令 字符串操作命令 哈希操作命令 列表操作命令 集合操作命令 有序集合操作命令 通用命令 在java中操作Redis Redis的Java客户端 …

uni-app在线预览pdf

这里推荐下载pdf.js 插件 PDF.js - Browse Files at SourceForge.net 特此注意 如果报 Promise.withResolvers is not a function 请去查看版本兼容问题 降低pdf.js版本提高node版本 下载完成后 在 static 文件夹下新建 pdf 文件夹&#xff0c;将解压文件放进 pdf 文件…

生信初学者教程(十一):数据校正

文章目录 介绍加载R包导入数据准备数据ComBatremoveBatchEffectVoom SNM批次效应校正结果比较校正后的结果输出校正后的结果总结介绍 批次效应在生物学数据分析中是一个普遍存在的问题,它指的是由于实验过程中非生物学因素(如样本处理时间、实验条件、测序平台等)的差异,导…

集师专属知识付费小程序搭建 心理咨询小程序搭建

一、产品简介 集师SaaS知识付费软件&#xff0c;为知识创业者或商家提供一站式内容交付解决方案&#xff0c;助力商家搭建集品牌传播、商业变现和用户运营于一体的线上知识服务系统&#xff0c;覆盖全渠道经营场景&#xff0c;占据每个流量入口&#xff0c;使流量变现快速高效…

Python笔记 - 利用装饰器设计注解体系

认识注解 注解&#xff08;Annotation&#xff09;是一种用于为代码添加元数据的机制。这些元数据可以在运行时被访问&#xff0c;用于为代码元素&#xff08;如类、方法、字段等&#xff09;提供额外的信息或指示。 由于Python中装饰器只能装饰类和方法&#xff0c;因此也只…

828华为云征文|华为云弹性云服务器FlexusX实例下的Nginx性能测试

本文写的是华为云弹性云服务器FlexusX实例下的Nginx性能测试 目录 一、华为云弹性云服务器FlexusX实例简介二、测试环境三、测试工具四、测试方法五、测试结果 下面是华为云弹性云服务器FlexusX实例下的Nginx性能测试。 一、华为云弹性云服务器FlexusX实例简介 华为云弹性云服…

【LLM论文日更】| 通过指令调整进行零样本稠密检索的无监督文本表示学习

论文&#xff1a;https://arxiv.org/pdf/2409.16497代码&#xff1a;暂未开源机构&#xff1a;Amazon AGI、宾夕法尼亚州立大学领域&#xff1a;Dense Retrieval发表&#xff1a;Accepted at DCAI24 workshopCIKM2024 研究背景 研究问题&#xff1a;这篇文章要解决的问题是如…