LeetCode 熱題 100 279. 完全平方數

LeetCode 熱題 100 | 279. 完全平方數

大家好,今天我們來解決一道經典的動態規劃問題——完全平方數。這道題在 LeetCode 上被標記為中等難度,要求找到和為給定整數 n 的完全平方數的最少數量。


問題描述

給定一個整數 n,返回和為 n 的完全平方數的最少數量。

示例 1:

輸入:n = 12
輸出:3
解釋:12 = 4 + 4 + 4

示例 2:

輸入:n = 13
輸出:2
解釋:13 = 4 + 9

提示:

  • 1 <= n <= 10^4

解題思路

核心思想
  1. 動態規劃

    • 使用動態規劃(DP)來解決這個問題。
    • 定義 dp[i] 為和為 i 的完全平方數的最少數量。
    • 狀態轉移方程為:
      [
      dp[i] = \min_{j^2 \leq i} (dp[i - j^2] + 1)
      ]
      其中,j^2 是小于等于 i 的完全平方數。
  2. 初始化

    • dp[0] = 0,因為和為 0 的完全平方數的最少數量是 0。
    • dp[1] = 1,因為和為 1 的完全平方數的最少數量是 1。
  3. 遍歷

    • 從 2 到 n 遍歷,對于每個 i,找到所有小于等于 i 的完全平方數 j^2,并更新 dp[i]

狀態轉移方程的推導

1. 定義狀態

dp[i] 表示和為 i 的完全平方數的最少數量。

2. 狀態轉移

假設我們已經知道了所有小于 idp 值,現在需要計算 dp[i]。為了得到和為 i 的完全平方數的最少數量,我們可以嘗試以下方法:

  • 選擇一個完全平方數:選擇一個完全平方數 j^2,使得 j^2 <= i
  • 計算剩余部分:如果選擇了 j^2,那么剩下的部分就是 i - j^2
  • 遞歸關系:因此,dp[i] 可以表示為 dp[i - j^2] + 1,其中 +1 表示我們選擇了一個完全平方數 j^2
3. 選擇最優解

由于 j^2 有多種可能(例如 1, 4, 9, 16 等),我們需要在所有可能的 j^2 中選擇一個使得 dp[i - j^2] + 1 最小的值。因此,狀態轉移方程為:

[
dp[i] = \min_{j^2 \leq i} (dp[i - j^2] + 1)
]

詳細解釋

假設我們正在計算 dp[12],即和為 12 的完全平方數的最少數量。我們可以嘗試以下完全平方數:

  • 選擇 j^2 = 1

    • 剩下的部分是 12 - 1 = 11
    • 因此,dp[12] = dp[11] + 1
  • 選擇 j^2 = 4

    • 剩下的部分是 12 - 4 = 8
    • 因此,dp[12] = dp[8] + 1
  • 選擇 j^2 = 9

    • 剩下的部分是 12 - 9 = 3
    • 因此,dp[12] = dp[3] + 1
  • 選擇 j^2 = 16

    • 16 > 12,所以不能選擇。

我們需要在這些選擇中找到最小值:

[
dp[12] = \min(dp[11] + 1, dp[8] + 1, dp[3] + 1)
]

Python代碼實現

class Solution(object):def numSquares(self, n):""":type n: int:rtype: int"""dp = [0] * (n + 1)dp[0] = 0dp[1] = 1for i in range(2, n + 1):temp = []j = 1while j * j <= i:temp.append(dp[i - j * j])j += 1dp[i] = min(temp) + 1return dp[n]

代碼解析

  1. 初始化

    • dp 數組初始化為長度為 n + 1 的列表,所有值初始化為 0。
    • dp[0] = 0,因為和為 0 的完全平方數的最少數量是 0。
    • dp[1] = 1,因為和為 1 的完全平方數的最少數量是 1。
  2. 狀態轉移

    • 遍歷從 2 到 n 的每個整數 i
    • 對于每個 i,找到所有小于等于 i 的完全平方數 j^2
    • dp[i - j^2] 的值存儲到臨時列表 temp 中。
    • 更新 dp[i]min(temp) + 1,表示選擇一個完全平方數 j^2 后的最小值。
  3. 返回結果

    • 最終結果存儲在 dp[n] 中。

復雜度分析

  • 時間復雜度:O(n * sqrt(n)),其中 n 是給定的整數。對于每個 i,需要遍歷所有小于等于 i 的完全平方數。
  • 空間復雜度:O(n),使用了長度為 n + 1dp 數組。

示例運行

示例 1
輸入:n = 12
輸出:3
解釋:12 = 4 + 4 + 4
示例 2
輸入:n = 13
輸出:2
解釋:13 = 4 + 9

總結

通過動態規劃的方法,我們可以高效地解決完全平方數問題。狀態轉移方程 dp[i] = \min_{j^2 \leq i} (dp[i - j^2] + 1) 確保了我們能夠找到和為 i 的完全平方數的最少數量。希望這篇題解對大家有所幫助,如果有任何問題,歡迎在評論區留言討論!

關注我,獲取更多算法題解和編程技巧!

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

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

相關文章

【coze】手冊小助手(提示詞、知識庫、交互、發布)

【coze】手冊小助手&#xff08;提示詞、知識庫、交互、發布&#xff09; 1、創建智能體2、添加提示詞3、創建知識庫4、測試智能體5、添加交互功能6、發布智能體 1、創建智能體 2、添加提示詞 # 角色 你是幫助用戶搜索手冊資料的AI助手 ## 工作流程 ### 步驟一:查詢知識庫 1.每…

一個基于Asp.Net Core + Angular + Bootstrap開源CMS系統

從零學習構建一個完整的系統 推薦一個功能強大、易于擴展、安全可靠的開源內容管理系統&#xff0c;適用于各種類型和規模的網站。 項目簡介 MixCoreCMS是一個基于.NET Core框架的開源內容管理系統&#xff08;CMS&#xff09;&#xff0c;提供了豐富的的基礎功能和插件&…

【Python】常用命令提示符

Python常用的命令提示符 一、Python環境基礎命令【Windows】 于Windows環境下&#xff0c;針對Python&#xff0c;在CMD&#xff08;命令提示符&#xff09;常用的命令以及具體用法&#xff0c;怎么用&#xff1b; ??主要包含&#xff1a;運行腳本、包管理、虛擬環境、調試與…

提示詞優化:檢索歷史提示確定方向→生成候選提示并控制修改幅度→基于準確率迭代優化

提示詞優化器 Unleashing the Potential of Large Language Models as Prompt Optimizers: Analogical Analysis with Gradient - based Model Optimizers 《Unleashing the Potential of Large Language Models as Prompt Optimizers: Analogical Analysis with Gradient - …

如何設計一個網頁計算器?—— 從需求分析到測試的全流程

1. 需求分析與功能設計 核心功能 基礎運算:+ - * / 高級運算:% (取模)、^ (冪運算)、√ (開平方) 記憶功能:M+ (累加)、M- (累減)、MR (讀取)、MC (清除) 交互優化: 支持鍵盤輸入(0-9、Enter、Backspace) 實時計算(類似 Google 計算器,輸入 2+3= 自動顯示 5) 錯誤處理…

基于RT-Thread的STM32F4開發第二講第一篇——ADC

文章目錄 前言一、RT-Thread工程創建二、ADC工程創建三、ADC功能實現1.ADC.c2.ADC.h3.mian.c 四、效果展示和工程分享總結 前言 ADC是什么不多講了&#xff0c;前面裸機操作部分有很多講述。我要說的是RT-Thread對STM32的ADC外設的適配極其不好&#xff0c;特別是STM32G4系類&…

FoMo 數據集是一個專注于機器人在季節性積雪變化環境中的導航數據集,記錄了不同季節(無雪、淺雪、深雪)下的傳感器數據和軌跡信息。

2025-05-02&#xff0c;由加拿大拉瓦爾大學北方機器人實驗室和多倫多大學機器人研究所聯合創建的 FoMo 數據集&#xff0c;目的是研究機器人在季節性積雪變化環境中的導航能力。該數據集的意義在于填補了機器人在極端季節變化&#xff08;如積雪深度變化&#xff09;下的導航研…

vue3+ts繼續學習

我們再寫點東西&#xff0c;這里面都是vue2的語法&#xff0c;應該都能看明白&#xff01;我們寫完直接去運行一下代碼&#xff01; 發現什么都沒有發生&#xff01;為什么呢&#xff1f;因為我們在App.vue中沒有引入&#xff01;哈哈哈哈&#xff01;這樣就好了&#xff01;注…

LIO-Livox

用單臺Livox Horizon (含內置IMU) 實現高魯棒性的激光-慣性里程計&#xff0c;可在各類極端場景下魯棒運行&#xff0c;并達到高精度的定位和建圖效果。(城區擁堵、高速公路、幽暗隧道) 注&#xff1a;該系統主要面向大型室外環境中的汽車平臺設計。用戶可以使用 Livox Horizo…

day18-API(常見API,對象克隆)

課程目標 能夠熟練使用Math類中的常見方法 能夠熟練使用System類中的常見方法 能夠理解Object類的常見方法作用 能夠熟練使用Objects類的常見方法 能夠熟練使用BigInteger類的常見方法 能夠熟練使用BigDecimal類的常見方法 1 Math類 1.1 概述 tips&#xff1a;了解內容…

用OMS從MySQL遷移到OceanBase,字符集utf8與utf8mb4的差異

一、問題背景 在一次從MySQL數據庫遷移到OceanBase的MySQL租戶過程中&#xff0c;出現了一個轉換提示&#xff1a; [WARN][CONVER] he table charset:utf8->utf8mb4&#xff0c; 你可能會擔心這種轉換可能導致字符集不兼容的問題。但通過查閱相關資料可知&#xff0c;utf8m…

MATLAB中tabulate函數——先驗概率的簡單估計

load fisheriris X meas(:,1:2); Y species; labels unique(Y); tabulate(Y)ValueCountPercentsetosa5033.33%versicolor5033.33%virginica5033.33%

《Python星球日記》第28天:數據獲取與可視化(綜合項目)

名人說:路漫漫其修遠兮,吾將上下而求索。—— 屈原《離騷》 創作者:Code_流蘇(CSDN)(一個喜歡古詩詞和編程的Coder??) 專欄:《Python星球日記》,限時特價訂閱中ing 目錄 一、項目概述二、數據獲取1. 準備工作2. 使用 `requests` 獲取網頁內容3. 使用 `BeautifulSoup`…

基于深度學習的圖像識別技術:從原理到應用

前言 在當今數字化時代&#xff0c;圖像識別技術已經滲透到我們生活的方方面面&#xff0c;從智能手機的人臉解鎖功能到自動駕駛汽車對交通標志的識別&#xff0c;再到醫療影像診斷中的病變檢測&#xff0c;圖像識別技術正以其強大的功能和廣泛的應用前景&#xff0c;改變著我們…

限免開關實施版本保護措施,保證項目灰度發布安全

迭代用戶限免權限校驗業務 新增限免開關實現普通用戶權益更新&#xff0c;實施版本保護措施&#xff0c;保證項目灰度發布安全&#xff1b; // 是否展示限免標識 func (t *BasePrivilegeService) IsPromotionFree(p consumParams) bool {// 限免開關isFreeUseOpen : p.cfg.Vip…

從 AWS Marketplace 開始使用 AssemblyAI 的語音轉文本模型構建語音智能

語音智能和語音轉文本 &#xff08;STT&#xff09; 技術已變得至關重要&#xff0c;因為組織每天收集數千小時的電話、會議和客戶互動。僅靠原始音頻并不能推動決策 - 組織需要智能來大規模地從語音數據中提取價值。語音智能結合了語音識別、自然語言處理 &#xff08;NLP&…

Android組件化 -> Debug模式下,本地構建module模塊的AAR和APK

本地構建module模塊的AAR gradle.properties isCommonApp false模塊的build.gradle apply plugin: com.android.library&#xff1a;module模塊編譯manifest.srcFile src/main/AndroidManifest.xml&#xff1a;讀取沒有啟動App和Activity的配置文件 if (isCommonApp.toBoo…

FlexibleButton:一個輕巧靈活的按鍵處理庫,讓你的按鍵處理更簡單

在嵌入式系統開發中&#xff0c;按鍵輸入處理是一個常見且重要的環節。然而&#xff0c;許多開發者在處理按鍵時&#xff0c;往往會遇到按鍵消抖、組合按鍵、長按/短按等功能實現的復雜性。如何在保證系統高效運行的同時&#xff0c;簡化按鍵事件的處理呢&#xff1f; 今天&…

探索程序員薪資背后的秘密與未來:智能化工具如何助力職場發展

最新接入DeepSeek-V3模型&#xff0c;點擊下載最新版本InsCode AI IDE 探索程序員薪資背后的秘密與未來&#xff1a;智能化工具如何助力職場發展 引言 在當今數字化時代&#xff0c;程序員作為科技發展的核心力量&#xff0c;其職業前景和薪資水平備受關注。隨著人工智能和自…

【STM32單片機】#14 PWR電源控制

主要參考學習資料&#xff1a; B站江協科技 STM32入門教程-2023版 細致講解 中文字幕 開發資料下載鏈接&#xff1a;https://pan.baidu.com/s/1h_UjuQKDX9IpP-U1Effbsw?pwddspb 單片機套裝&#xff1a;STM32F103C8T6開發板單片機C6T6核心板 實驗板最小系統板套件科協 目錄 PWR…