C++面试题(35)-------找出第 n 个丑数(Ugly Number)

  • 操作系统:ubuntu22.04
  • IDE:Visual Studio Code
  • 编程语言:C++11

题目描述

我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。例如 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。
请编写一个函数,找出第 n 个丑数。

示例:

输入: n = 10
输出: 12
解释: 第10个丑数是12

解法思路:动态规划 + 三指针

这是一道典型的动态规划问题,也可以用最小堆来解,但最优解是使用 三指针法,时间复杂度为 O(n),空间复杂度为 O(n)。
思路详解:

我们要构造一个丑数数组 dp[],其中 dp[i] 表示第 i 个丑数。

每个新的丑数只能由之前的丑数乘以 2、3 或 5 得到。

我们维护三个指针:

  • i2:指向下一个将乘以 2 的位置;
  • i3:指向下一个将乘以 3 的位置;
  • i5:指向下一个将乘以 5 的位置;

每次取这三个候选值中的最小值作为下一个丑数,并移动对应指针

代码实现


#include <vector>using namespace std;class Solution {
public:int nthUglyNumber( int n ){vector< int > dp( n );dp[ 0 ] = 1;  // 第一个丑数是1int i2 = 0, i3 = 0, i5 = 0;for ( int i = 1; i < n; ++i ){int next2 = dp[ i2 ] * 2;int next3 = dp[ i3 ] * 3;int next5 = dp[ i5 ] * 5;int nextUgly = min( next2, min( next3, next5 ) );dp[ i ]      = nextUgly;if ( nextUgly == next2 )i2++;if ( nextUgly == next3 )i3++;if ( nextUgly == next5 )i5++;}return dp[ n - 1 ];}
};#include <iostream>int main()
{Solution sol;cout <<"第10个丑数:"<< sol.nthUglyNumber( 10 ) << endl;  // 输出 12cout <<"第1个丑数:"<< sol.nthUglyNumber( 1 ) << endl;   // 输出 1cout << "第15个丑数:"<<sol.nthUglyNumber( 15 ) << endl;  // 输出 24return 0;
}

运行结果

第10个丑数:12
第1个丑数:1
第15个丑数:24

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

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

相关文章

Day03_数据结构(手写)

01.数据结构画图 02. //11.按值查找返回位置 int search_value(node_p H,int value) { if(HNULL){ printf("入参为空.\n"); return -1; …

【Java学习笔记】Collections工具类

Collections 工具类 基本介绍 &#xff08;1&#xff09;Collections 中提供了一系列静态方法对集合元素进行排序&#xff0c;查询和修改等操作 &#xff08;2&#xff09;操作对象&#xff1a;集合 常用方法一览表 方法描述reverse(List<?> list)反转 List 中元素…

spring-webmvc @ResponseBody 典型用法

典型用法 基本用法&#xff1a;返回 JSON 数据 GetMapping("/users/{id}") ResponseBody public User getUser(PathVariable Long id) {return userService.findById(id); }Spring 自动使用 Jackson&#xff08;或其他 HttpMessageConverter&#xff09;将 User 对…

AI-调查研究-08-跑步分析研究 潜在伤害与预防 不同年龄段与性别的情况

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月16日更新到&#xff1a; AI炼丹日志-29 - 字节…

AI任务相关解决方案9-深度学习在工业质检中的应用:基于DeepLabv3+模型的NEU-seg数据集语义分割研究

大家好我是微学AI,今天给大家介绍一下AI任务相关解决方案9-深度学习在工业质检中的应用:基于DeepLabv3+模型的NEU-seg数据集语义分割研究。DeepLabv3+模型在NEU-seg数据集上实现了高达87.65%的平均交并比(mIoU),为金属表面缺陷的高精度检测提供了有力工具。本文将详细探讨Dee…

mysql JSON_EXTRACT JSON_UNQUOTE 函数

在处理mysql 有存储的json字段&#xff0c;需要提取时候发现JSON_EXTRACT函数&#xff0c;发现此函数提取后会带有引号&#xff0c;组合使用JSON_UNQUOTE 可去掉引号&#xff01; JSON_EXTRACT 函数概述 JSON_EXTRACT是MySQL中用于从JSON文档中提取数据的函数&#xff0c;语法…

Prompt:更好的提示与迭代

欢迎来到啾啾的博客&#x1f431;。 记录学习点滴。分享工作思考和实用技巧&#xff0c;偶尔也分享一些杂谈&#x1f4ac;。 有很多很多不足的地方&#xff0c;欢迎评论交流&#xff0c;感谢您的阅读和评论&#x1f604;。 目录 1 引言1.1 引用资料 2 更好的提示2.1 情景学习IC…

SQL85 统计每个产品的销售情况

SQL85 统计每个产品的销售情况 好复杂&#xff0c;俺不中了。。 问题描述 本查询旨在分析2023年各产品的销售情况&#xff0c;包括&#xff1a; 每个产品的总销售额、单价、总销量和月均销售额每个产品销量最高的月份及其销量每个产品购买量最高的客户年龄段 解题思路 1. 基…

Django MAC Pycharm 命令行建立项目,注册app运行失败,找不到views导入包

相对复杂的情况 你没有直接在Pycharm中建立一个Django项目&#xff0c;而是直接建立某个项目或者打开某个项目&#xff0c;使用命令后安装Django后&#xff0c;使用命令后建立了Django项目&#xff0c;尽管你的目录尽可能干净&#xff0c;只有Django项目&#xff0c;但是这仍然…

窄带和宽带谁略谁优

窄带&#xff08;Narrowband&#xff09;与宽带&#xff08;Broadband&#xff09;深度对比 ——涵盖 优缺点、适用场景、调制方式 1. 窄带&#xff08;Narrowband&#xff09; 1.1 核心特点 带宽&#xff1a;≤25 kHz&#xff08;典型值&#xff0c;如NB-IoT仅占用180kHz&a…

李佳琦直播间618收官:6成销量为国货,多品类增超25%

618大促迎来收官&#xff0c;作为电商消费的关键风向标&#xff0c;李佳琦直播间生动呈现了当下消费市场的多元趋势。 据「TMT星球」了解&#xff0c;在长达近40天的大促里&#xff0c;李佳琦直播间不仅延续过往的高人气与强带货力&#xff0c;更在高质价比产品、高质量服务保…

c++ noexcept关键字

noexcept 是 C11 中引入的一个关键字&#xff0c;用来标记函数声明&#xff0c;表示该函数不会抛出异常。它可以用于函数、函数指针、Lambda 表达式等。使用 noexcept 可以帮助编译器进行优化&#xff0c;提高代码的执行效率&#xff0c;并且让程序在处理异常时更加明确。 1. …

腾讯混元3D制作简单模型教程-2

以下是腾讯混元3D制作简单模型的详细教程&#xff0c;整合最新版本特性&#xff08;截至2025年6月&#xff09;&#xff0c;操作门槛低且无需专业基础&#xff1a; &#x1f5a5; 一、在线生成&#xff08;最快30秒完成&#xff09; ‌访问平台‌ 打开 腾讯混元3D创作引擎官网…

阿里云申请ssl证书,同时需要绑定域名,下载nginx压缩包,nginx添加证书路径即可

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、ssl是什么&#xff1f;二、登录阿里云三、图片教程四、添加域名前缀&#xff08;www&#xff09;如&#xff1a;www.baidu.com总结 一、ssl是什么&#xff1f; …

额度互动促进金融健康,蚂蚁消金创新智能实时交互式风控系统

“蚂蚁消金希望利用交互式智能风控技术&#xff0c;挖掘年轻人努力成长的证明”。6月19日&#xff0c;在上海举行的2025中国国际金融展上&#xff0c;蚂蚁消金首席风险官林嘉南分享了&#xff0c;如何将大模型技术应用在交互式智能风控领域&#xff0c;从而促进额度的互动性&am…

SAP-ABAP:LOOP ... ASSIGNING高效处理内表数据详解

在ABAP中&#xff0c;LOOP ... ASSIGNING 是高效处理内表数据的关键技术&#xff0c;它通过字段符号(field symbol) 直接访问内表内存地址&#xff0c;避免数据副本创建。以下是详细用法指南&#xff1a; 一、基础语法结构 FIELD-SYMBOLS: <fs_line> TYPE any. " …

Tomcat本地部署Maven Java Web项目

接下来是在widows部署maven javaweb 首先要配置tomcat&#xff0c;我这里是联合项目&#xff0c;需要配置多个tomcat 选择每个对应的war包 这里的项目名和端口号要改&#xff0c;否则多个项目启动会因为端口号占用无法启动 Tomcat运行项目 打包 在右边的Maven视图里面找到…

golang--具名返回值、匿名返回值与 defer 语句之间的关系,以及 panic 对它们的影响

好的&#xff0c;我们来详细探讨 Go 语言中具名返回值、匿名返回值与 defer 语句之间的关系&#xff0c;以及 panic 对它们的影响。这是 Go 错误处理和资源管理中的核心机制。 核心概念 具名返回值 (Named Return Values): 在函数签名中声明返回变量名。例如&#xff1a;fun…

FFmpeg 超级详细安装与配置教程(Windows 系统)

1. 前言 FFmpeg 是一个用于处理视频、音频等多媒体文件的开源工具包。它支持几乎所有的多媒体格式转换、剪辑和编辑&#xff0c;是开发者和多媒体工作者必备的工具。本文详细讲解如何在 Windows 系统上安装 FFmpeg 并进行基本配置。 2. 下载 FFmpeg 安装包 打开 Download FFmp…

Pytorch中gather()函数详解和实战示例

在 PyTorch 中&#xff0c;torch.gather() 是一个非常实用的张量操作函数&#xff0c;主要用于根据索引从输入张量中选择特定位置的值。它常用于注意力机制、序列处理等场景。 函数定义 torch.gather(input, dim, index) → Tensorinput&#xff1a;待提取数据的张量。dim&…