Leetcode.264 丑數 II

題目鏈接

Leetcode.264 丑數 II mid

題目描述

給你一個整數 n n n ,請你找出并返回第 n n n丑數

丑數 就是質因子只包含 2 2 2 3 3 3 5 5 5 的正整數。

示例1:
輸入:n = 10
輸出:12
解釋:[1, 2, 3, 4, 5, 6, 8, 9, 10, 12] 是由前 10 個丑數組成的序列。
示例2:
輸入:n = 1
輸出:1
解釋:1 通常被視為丑數。
提示:
  • 1 ≤ n ≤ 1690 1 \leq n \leq 1690 1n1690

解法:動態規劃

f ( n ) f(n) f(n) 代表第 n n n丑數

因為每個丑數都只包含 2 , 3 , 5 2, 3, 5 2,3,5 的質因子(除開 1 1 1),那么 f ( n ) f(n) f(n) 也就是第 n n n丑數,必然是由 [ 1 , n ? 1 ] [1, n - 1] [1,n?1] 之間的某一個丑數,假設是 f ( i ) × 2 , f ( i ) × 3 , f ( i ) × 5 f(i) \times 2,f(i) \times 3, f(i) \times 5 f(i)×2,f(i)×3,f(i)×5,三個其中的一個而來。

很顯然, f ( n ) f(n) f(n) 的值一定是 f ( i ) × 2 , f ( i ) × 3 , f ( i ) × 5 f(i) \times 2,f(i) \times 3, f(i) \times 5 f(i)×2,f(i)×3,f(i)×5 三者之中的最小值

舉例說明:

f(1) = 1
f(2) = f(1) * 2 = 2
f(3) = f(1) * 3 = 3
f(4) = f(2) * 2 = 4
f(5) = f(1) * 5 = 5
f(6) = f(3) * 2 = 6
f(7) = f(4) * 2 = 8
f(8) = f(3) * 3 = 9

我們用三個指針 a , b , c a, b, c a,b,c 分別代表 × 2 \times 2 ×2 × 3 \times 3 ×3 × 5 \times 5 ×5 代表的丑數。那么當前的丑數 f ( i ) f(i) f(i) 就是 m i n { f ( a ) × 2 , f ( b ) × 3 , f ( c ) × 5 } min\{ f(a) \times 2, f(b) \times 3, f(c) \times 5\} min{f(a)×2,f(b)×3,f(c)×5}


r 2 = f ( a ) × 2 r 3 = f ( b ) × 3 r 5 = f ( c ) × 5 r_2 = f(a) \times 2 \\ r_3 = f(b) \times 3 \\ r_5 = f(c) \times 5 r2?=f(a)×2r3?=f(b)×3r5?=f(c)×5

如果 f ( i ) = r 2 f(i) = r_2 f(i)=r2?,那么指針 a a a 就往后移動一位。

其原理是,如果 r 2 = f ( a ) × 2 r_2 = f(a) \times 2 r2?=f(a)×2 就是當前的第 i i i 個丑數,那么我們記錄答案, f ( i ) = r 2 f(i) = r_2 f(i)=r2?。既然 f ( a ) × 2 f(a) \times2 f(a)×2 這個丑數已經在當前的答案集合 f f f 中了,那么比當前丑數 f ( a ) × 2 f(a) \times2 f(a)×2 更小的丑數也肯定在答案集合 f f f 中,所以后面只需要考慮比 f ( a ) × 2 f(a) \times 2 f(a)×2 更大的丑數,也就是 f ( a + 1 ) × 2 f(a+1) \times 2 f(a+1)×2,所以指針 a a a 才要往后移動一位。

對于 f ( i ) = r 3 f(i)=r_3 f(i)=r3? f ( i ) = r 5 f(i) = r_5 f(i)=r5? 的情況同理。

a , b , c a, b,c a,b,c 都初始化為 1 1 1 f ( 1 ) = 1 f(1) = 1 f(1)=1

{ r 2 = f ( a ) × 2 r 3 = f ( b ) × 3 r 5 = f ( c ) × 5 f ( i ) = m i n { r 2 , r 3 , r 5 } , i ∈ [ 2 , n ] i f r 2 = f ( i ) t h e n a + 1 i f r 3 = f ( i ) t h e n b + 1 i f r 5 = f ( i ) t h e n c + 1 \left\{\begin{array}{l} r_2 = f(a) \times 2 \\ r_3 = f(b) \times 3 \\ r_5 = f(c) \times 5 \\ f(i) = min\{r_2, r_3,r_5\},\ i \in [2,n]\\ if\ r_2=f(i) \ then \ a + 1 \\ if\ r_3=f(i) \ then \ b + 1 \\ if\ r_5=f(i) \ then \ c + 1 \end{array}\right. ? ? ??r2?=f(a)×2r3?=f(b)×3r5?=f(c)×5f(i)=min{r2?,r3?,r5?},?i[2,n]if?r2?=f(i)?then?a+1if?r3?=f(i)?then?b+1if?r5?=f(i)?then?c+1?

時間復雜度: O ( n ) O(n) O(n)

C++:

class Solution {
public:int nthUglyNumber(int n) {vector<int> f(n + 1);f[1] = 1;int a = 1, b = 1, c = 1;for(int i = 2; i <= n; ++i){int r2 = f[a] * 2, r3 = f[b] * 3, r5 = f[c] * 5;f[i] = min({r2, r3, r5});if(f[i] == r2) a++;if(f[i] == r3) b++;if(f[i] == r5) c++;}return f[n];}
};

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/896079.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/896079.shtml
英文地址,請注明出處:http://en.pswp.cn/news/896079.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

瑞芯微RV1126部署YOLOv8全流程:環境搭建、pt-onnx-rknn模型轉換、C++推理代碼、錯誤解決、優化、交叉編譯第三方庫

目錄 1 環境搭建 2 交叉編譯opencv 3 模型訓練 4 模型轉換 4.1 pt模型轉onnx模型 4.2 onnx模型轉rknn模型 4.2.1 安裝rknn-toolkit 4.2.2 onn轉成rknn模型 5 升級npu驅動 6 C++推理源碼demo 6.1 原版demo 6.2 增加opencv讀取圖片的代碼 7 交叉編譯x264 ffmepg和op…

【Python爬蟲(32)】從單飛 to 團戰:Python多線程爬蟲進化史

【Python爬蟲】專欄簡介&#xff1a;本專欄是 Python 爬蟲領域的集大成之作&#xff0c;共 100 章節。從 Python 基礎語法、爬蟲入門知識講起&#xff0c;深入探討反爬蟲、多線程、分布式等進階技術。以大量實例為支撐&#xff0c;覆蓋網頁、圖片、音頻等各類數據爬取&#xff…

C#初級教程(1)——C# 與.NET 框架:探索微軟平臺編程的強大組合

圖片來源&#xff1a; https://www.lvhang.site/docs/dotnettimeline 即夢AI - 一站式AI創作平臺 一、歷史發展脈絡 在早期的微軟平臺編程中&#xff0c;常用的編程語言有 Visual Basic、C、C。到了 20 世紀 90 年代末&#xff0c;Win32 API、MFC&#xff08;Microsoft Found…

【接口封裝】——13、登錄窗口的標題欄內容設置

解釋&#xff1a; 1、封裝內容&#xff1a;圖標、文本內容、寬度 2、ui.iconLabel&#xff1a;在UI文件中的自定義命名 3、引入頭文件&#xff1a;#include<qpixmap.h> 函數定義&#xff1a; #pragma once#include <QWidget> #include "ui_TitleBar.h"cl…

DeepSeek全生態接入指南:官方通道+三大云平臺

DeepSeek全生態接入指南&#xff1a;官方通道三大云平臺 一、官方資源入口 1.1 核心交互平臺 &#x1f5a5;? DeepSeek官網&#xff1a; https://chat.deepseek.com/ &#xff08;體驗最新對話模型能力&#xff09; 二、客戶端工具 OllamaChatboxCherry StudioAnythingLLM …

web安全:跨站請求偽造 (CSRF)

跨站請求偽造 (CSRF) ? 跨站請求偽造&#xff08;CSRF&#xff0c;Cross-Site Request Forgery&#xff09; 是一種網絡攻擊方式&#xff0c;攻擊者誘使受害者在未經其授權的情況下執行特定操作。CSRF 利用受害者已登錄的身份和瀏覽器自動發送的認證信息&#xff08;如 Cooki…

前端ES面試題及參考答案

目錄 let/const 與 var 的區別?TDZ 是什么? 箭頭函數與普通函數的區別?箭頭函數能否作為構造函數? 模板字符串的嵌套表達式和標簽模板用法? 解構賦值的應用場景及對象 / 數組解構差異? 函數參數默認值的生效條件及暫時性死區問題? 展開運算符(...)在數組 / 對象中…

Windows 圖形顯示驅動開發-查詢 WDDM(3.2) 功能支持和啟用

查詢 Windows 顯示驅動程序模型 (WDDM) 功能的支持和啟用。 其中介紹了&#xff1a; 用戶模式和內核模式顯示驅動程序&#xff08;UMD 和 KMD&#xff09;如何查詢 OS&#xff0c;以確定 WDDM 功能在系統上是否受支持和已啟用。 OS 如何確定驅動程序是否支持特定的 WDDM 功能…

MySQL InnoDB 存儲引擎的索引詳解

在 MySQL 中&#xff0c;InnoDB 是最常用的存儲引擎&#xff0c;它支持事務、行級鎖和外鍵約束等功能&#xff0c;而索引則是提升數據庫查詢性能的關鍵。在 InnoDB 存儲引擎中&#xff0c;索引不僅僅是提高查詢速度的工具&#xff0c;還是數據庫的核心組成部分之一。本文將詳細…

基于Spring Boot的RabbitMQ延時隊列技術實現

文章目錄 基于Spring Boot的RabbitMQ延時隊列技術實現延時隊列應用場景基本概念實現延時隊列添加依賴基礎配置配置類設計消息生產者消息消費者 兩種TTL設置方式 訂單超時關閉實例訂單服務消息處理 延遲消息插件安裝插件配置延遲交換機 基于Spring Boot的RabbitMQ延時隊列技術實…

畢業項目推薦:基于yolov8/yolov5/yolo11的番茄成熟度檢測識別系統(python+卷積神經網絡)

文章目錄 概要一、整體資源介紹技術要點功能展示&#xff1a;功能1 支持單張圖片識別功能2 支持遍歷文件夾識別功能3 支持識別視頻文件功能4 支持攝像頭識別功能5 支持結果文件導出&#xff08;xls格式&#xff09;功能6 支持切換檢測到的目標查看 二、數據集三、算法介紹1. YO…

【智能客服】ChatGPT大模型話術優化落地方案

本文原創作者:姚瑞南 AI-agent 大模型運營專家,先后任職于美團、獵聘等中大廠AI訓練專家和智能運營專家崗;多年人工智能行業智能產品運營及大模型落地經驗,擁有AI外呼方向國家專利與PMP項目管理證書。(轉載需經授權) 目錄 一、項目背景 1.1 行業背景 1.2 業務現…

STM32的HAL庫開發---單通道ADC采集(DMA讀取)實驗

一、實驗簡介 正常單通道ADC采集順序是先開啟ADC采集&#xff0c;然后等待ADC轉換完成&#xff0c;也就是判斷EOC位置1&#xff0c;然后再讀取數據寄存器的值。 如果配置了DMA功能&#xff0c;在EOC位被硬件置1后&#xff0c;自動產生DMA請求&#xff0c;然后DMA進行數據搬運…

編譯原理基礎(1)

1.什么是ASCII碼&#xff1f; ASCII碼即美國信息交換標準代碼&#xff0c;是基于拉丁字母的電腦編碼系統&#xff0c;用于顯示現代英語和部分西歐語言。其7位編碼范圍0-127&#xff0c;8位擴展到0-255。字符集含控制字符&#xff08;0-31、127&#xff0c;用于控制設備或表示通…

基于 Highcharts 實現 Vue 中的答題統計柱狀圖組件

在現代 Web 開發中&#xff0c;數據可視化是一個重要的組成部分&#xff0c;而 Highcharts 是一個廣泛使用的 JavaScript 圖表庫&#xff0c;可以幫助開發者在 Web 頁面上輕松地繪制豐富的圖表。在本文中&#xff0c;我們將基于 Highcharts 創建一個用于答題統計的柱狀圖&#…

SQLAlchemyError: A transaction is already begun on this Session.

資料 sqlalchemy 事務 - 簡書 在 SQLAlchemy 中&#xff0c;事務是通過會話來管理的。當你開始一個事務&#xff08;例如使用 async with db.begin()&#xff09;&#xff0c;它會開啟一個新的事務&#xff0c;并在事務塊結束時自動提交或回滾。如果在同一個會話中&#xff0c…

Java Web開發實戰與項目——Spring Boot與Redis實現緩存管理

緩存技術在現代Web開發中至關重要&#xff0c;尤其是在高并發的環境中&#xff0c;緩存能夠有效減少數據庫訪問壓力、提高系統性能。Redis作為最流行的內存數據存儲系統之一&#xff0c;常用于緩存管理。本節將講解如何在Spring Boot項目中集成Redis&#xff0c;實現緩存管理&a…

C語言學習【1】C語言關于寄存器的封裝

目錄 1.封裝寄存的C語言的語法volatile&#xff1a;unsigned int:*pGpiobOdrvolatile unsigned int * 2.進一步C語言的封裝 在嵌入式中&#xff0c;底層一定是操作寄存器&#xff0c;我有一個理念&#xff0c;凡事一定要想清楚&#xff0c;把任何知識點融入自己的理解之中&…

#滲透測試#批量漏洞挖掘#暢捷通T+遠程命令執行漏洞

免責聲明 本教程僅為合法的教學目的而準備,嚴禁用于任何形式的違法犯罪活動及其他商業行為,在使用本教程前,您應確保該行為符合當地的法律法規,繼續閱讀即表示您需自行承擔所有操作的后果,如有異議,請立即停止本文章讀。 目錄 一、漏洞概況 二、攻擊特征 三、應急處置…

ollama 學習筆記

1. 參考博客&#xff1a;1. Ollama完整教程&#xff1a;本地LLM管理、WebUI對話、Python/Java客戶端API應用&#xff1a;https://blog.csdn.net/python122_/article/details/1409457202. https://gitee.com/ai-big-model/ollama/tree/main --》REST APIollama 離線安裝包 ollam…