第四十五天| 322. 零錢兌換、279.完全平方數

Leetcode?322. 零錢兌換

題目鏈接:322 零錢兌換

題干:給你一個整數數組?coins?,表示不同面額的硬幣;以及一個整數?amount?,表示總金額。計算并返回可以湊成總金額所需的?最少的硬幣個數?。如果沒有任何一種硬幣組合能組成總金額,返回?-1?。

你可以認為每種硬幣的數量是無限的。

  • 1 <= coins.length <= 12
  • 1 <= coins[i] <= 231?- 1
  • 0 <= amount <= 104

思考:動態規劃。題目中說每種硬幣的數量是無限的,可以看出是典型的完全背包問題。

  • 確定dp數組以及下標的含義

dp[j]:從coins中任取硬幣,達到總金額為i所需硬幣的最小數

  • 確定遞推公式

湊足總額為j - coins[i]的最少個數為dp[j - coins[i]],那么只需要加上一個錢幣coins[i]即dp[j - coins[i]] + 1就是dp[j](考慮coins[i])。并且dp[j] 要取所有 dp[j - coins[i]] + 1 中最小的。

所以遞推公式為dp[j] = min(dp[j - coins[i]] + 1, dp[j]);

  • dp數組如何初始化

首先湊足總金額為0所需錢幣的個數一定是0,那么dp[0] = 0;

從遞推公式可以看出,非0下標的dp[j]必須初始化為一個最大的數,否則就會在min(dp[j - coins[i]] + 1, dp[j])比較的過程中被初始值覆蓋。所以下標非0的元素都是應該是最大值INT_MAX。

  • 確定遍歷順序

由于本題求錢幣最小個數,那么錢幣的選取有順序和沒有順序都可以。

所以本題外層for循環遍歷物品,內層for遍歷背包或者外層for遍歷背包,內層for循環遍歷物品都是可以的。下面代碼采用硬幣放在外循環,總金額在內循環的方式。

本題是完全背包類似問題,所以遍歷的內循環是正序。

  • 舉例推導dp數組

距離:coins = [1, 2, 5], amount = 5,dp狀態圖如下:

代碼:

class Solution {
public:int coinChange(vector<int>& coins, int amount) {vector<int> dp(amount + 1, INT_MAX);        //從coins中任取硬幣,達到總金額為i所需硬幣的最小數dp[0] = 0;for (int i = 0; i < coins.size(); i++)          //遍歷硬幣for (int j = coins[i]; j <= amount; j++)    //遍歷總金額if (dp[j - coins[i]] != INT_MAX)        //最大值不去處理dp[j] = min(dp[j], dp[j - coins[i]] + 1);return dp[amount] == INT_MAX ? -1 : dp[amount];}
};

Leetcode?279.完全平方數

題目鏈接:279 完全平方數

題干:給你一個整數?n?,返回?和為?n?的完全平方數的最少數量?。

完全平方數?是一個整數,其值等于另一個整數的平方;換句話說,其值等于一個整數自乘的積。例如,149?和?16?都是完全平方數,而?3?和?11?不是。

  • 1 <= n <= 104

思考:動態規劃。完全平方數就是物品(可以無限件使用),湊個正整數n就是背包。

  • 確定dp數組(dp table)以及下標的含義

dp[j]:達到累計和為i,最少所需完全平方數個數

  • 確定遞推公式

dp[j] 可以由dp[j - i * i]推出, dp[j - i * i] + 1 便可以湊成dp[j]。并且要選擇最小的dp[j]

所以遞推公式:dp[j] = min(dp[j - i * i] + 1, dp[j]);

  • dp數組如何初始化

dp[0]表示 和為0的完全平方數的最小數量,因此dp[0]一定是0。

從遞歸公式可以看出每次dp[j]都要選最小的,所以非0下標的dp[j]一定要初始為最大值,這樣dp[j]在遞推的時候才不會被初始值覆蓋。

  • 確定遍歷順序

由于本題求滿足條件的完全平方數最少個數,那么完全平方數的選取有順序和沒有順序都可以。

所以本題外層for循環遍歷物品,內層for遍歷背包或者外層for遍歷背包,內層for循環遍歷物品都是可以的。下面代碼采用完全平方數放在外循環,累加和在內循環的方式。

本題是完全背包類似問題,所以遍歷的內循環是正序。

  • 舉例推導dp數組

舉例:n為5,dp狀態圖如下:

代碼:

class Solution {
public:int numSquares(int n) {vector<int> dp(n + 1, INT_MAX);     //dp[i]表示達到累計和為i,最少所需完全平方數個數dp[0] = 0;for (int i = 1; i * i <= n; i++)          //遍歷完全平方數for (int j = i * i; j <= n; j++)        //遍歷累加和if (dp[j - i * i] != INT_MAX)       //初始最大值不處理dp[j] = min(dp[j], dp[j - i * i] + 1);return dp[n];}
};

自我總結:

  • 動態規劃中確定遞歸順序中:
    • 如果求組合數就是外層for循環遍歷物品,內層for遍歷背包。
    • 如果求排列數就是外層for遍歷背包,內層for循環遍歷物品。

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

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

相關文章

AI大語言模型【成像光譜遙感技術】ChatGPT應用指南

遙感技術主要通過衛星和飛機從遠處觀察和測量我們的環境&#xff0c;是理解和監測地球物理、化學和生物系統的基石。ChatGPT是由OpenAI開發的最先進的語言模型&#xff0c;在理解和生成人類語言方面表現出了非凡的能力。本文重點介紹ChatGPT在遙感中的應用&#xff0c;人工智能…

vscode + git

寫在前面&#xff1a; origin分支&#xff1a; 當我們在使用git clone的時候&#xff0c;git會自動地將這個遠程的repo命名為origin&#xff0c;拉取它所有的數據之后&#xff0c;創建一個指向它master的指針&#xff0c;命名為origin/master&#xff0c;之后會在本地創建一個…

C#單向鏈表實現:用泛型類在當前位置插入新數據的方法Insert()

一、涉及到的知識點 1.ListNode<T>類 ListNode<T>是一個泛型類&#xff0c;用于表示鏈表中的一個節點。Value和Next屬性是ListNode<T>最基本的屬性&#xff0c;用于表示節點的值和指向下一個節點的引用。但是&#xff0c;完全可以根據實際需求添加其他屬性&…

雙非二本找實習前的準備day5

學習目標&#xff1a; 每天2-3到簡單sql&#xff08;刷完即止&#xff09;&#xff0c;每天復習代碼隨想錄上的題目3道算法&#xff08;時間充足可以繼續&#xff09;&#xff0c;今天的八股背少一點&#xff0c;MySQL和Redis各1-2道好了&#xff0c;主攻復習是java基礎 今日…

C語言5道編程題簡單介紹(三)

1、打印楊輝三角 程序分析&#xff1a; 結構如下所示&#xff1a; 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1代碼如下&#xff1a; #include <stdio.h>int main() {int i,j;int a[10][10];printf("\n");for(i0;i<10;i) {a[i][0]1;a…

Vuex 是什么?它在 Vue 應用中扮演什么角色?解釋一下 Vuex 的狀態管理模式。如何在 Vuex 中進行異步操作?

一、Vuex 是什么&#xff1f; Vuex 是一個專為 Vue.js 應用程序開發的狀態管理模式。它采用集中式存儲管理應用的所有組件的狀態&#xff0c;并以相應的規則保證狀態以一種可預測的方式發生變化。Vuex 的出現解決了多個組件間共享狀態的問題&#xff0c;使得狀態管理變得更加直…

#WEB前端(HTML屬性)

1.實驗&#xff1a;a,img 2.IDE&#xff1a;VSCODE 3.記錄&#xff1a; a: href插入超鏈接 默認情況下在本窗口打開鏈接, target可以設置打開的窗口,parent在父窗口打開&#xff0c;blank新開串口打開,top在頂層串口打開,self為默認在本窗口打開 img: 插入圖片 可以插…

解析/區分MOS管的三個引腳G、S、D(NMOS管和PMOS管)

MOS管的三個引腳分別是Gate&#xff08;柵極&#xff09;、Source&#xff08;源極&#xff09;和Drain&#xff08;漏極&#xff09;。以下是詳細介紹&#xff1a; Gate&#xff08;柵極&#xff09;。這是控制MOS管開關的關鍵引腳&#xff0c;用于控制電流的流通。Source&…

智能分析網關V4安全帽檢測/反光衣檢測/通用工服檢測算法及應用

TSINGSEE青犀視頻智能分析網關V4內置了近40種AI算法模型&#xff0c;支持對接入的視頻圖像進行人、車、物、行為等實時檢測分析&#xff0c;上報識別結果&#xff0c;并能進行語音告警播放。硬件管理平臺支持RTSP、GB28181協議、以及廠家私有協議接入&#xff0c;可兼容市面上常…

【DDD】學習筆記-實體和值對象:從領域模型的基礎單元看系統設計

今天我們來學習 DDD 戰術設計中的兩個重要概念&#xff1a;實體和值對象。 這兩個概念都是領域模型中的領域對象。它們在領域模型中起什么作用&#xff0c;戰術設計時如何將它們映射到代碼和數據模型中去&#xff1f;就是我們這一講重點要關注的問題。 另外&#xff0c;在戰略…

springboot238光影視頻

光影視頻平臺 摘 要 使用舊方法對光影視頻平臺的信息進行系統化管理已經不再讓人們信賴了&#xff0c;把現在的網絡信息技術運用在光影視頻平臺的管理上面可以解決許多信息管理上面的難題&#xff0c;比如處理數據時間很長&#xff0c;數據存在錯誤不能及時糾正等問題。這次開…

APS面試審核準備的常規問題

之前根據其他人的經驗貼&#xff0c;準備了一些可能APS 面試審核可能會遇到的常規問題&#xff0c;現在簡單分享一下。 一般會考慮到留學資金來源&#xff0c;在德國能不能順利畢業&#xff1b;學的是什么專業內容之類的&#xff0c;判斷去德國會不會好好學習&#xff1b;對德國…

Linux:上傳文件到虛擬機

常見的方法&#xff1a; 使用虛擬機軟件提供的文件共享功能&#xff1a; 對于VMware Workstation&#xff0c;可以使用“共享文件夾”功能。對于VirtualBox&#xff0c;可以使用“共享文件夾”或“拖放”功能。 使用網絡文件共享服務&#xff1a; 您可以在虛擬機中配置一個Sam…

【Python入門教程】Python實現雞兔同籠

今天跟大家分享一下很久之前自己做的雞兔同籠求解問題的小游戲&#xff0c;使用公式和基本的判斷語句即可實現&#xff0c;可以用來當練手或者消磨時間用。 大家在編代碼的時候最重要就是先理清邏輯思路&#xff0c;例如應該套幾層循環、分幾個模塊等等。然后在編碼時可以先隨意…

TS中符號的用法:?、??、 !、 !!

1) ? 的用法 示例&#xff1a; const obj res?.data || {}; // obj是從接口中取到的數據const dataError obj.a.b; // 若obj為空&#xff0c;則此時會報錯const dataSafe obj?.a?.b; // 相當于 const dataSafe obj && obj.a && obj.a.b ? obj.a.b…

wy的leetcode刷題記錄_Day80

wy的leetcode刷題記錄_Day80 聲明 本文章的所有題目信息都來源于leetcode 如有侵權請聯系我刪掉! 時間&#xff1a;2024-3-2 前言 目錄 wy的leetcode刷題記錄_Day80聲明前言2368. 受限條件下可到達節點的數目題目介紹思路代碼收獲 92. 反轉鏈表 II題目介紹思路代碼收獲 2368…

Redis持久化+Redis內存管理和優化+Redis三大緩存問題

Redis持久化Redis內存管理和優化Redis三大緩存問題一、Redis高可用二、Redis持久化1、RDB持久化1.1 觸發條件(1) 手動觸發(2) 自動觸發(3) 其他自動觸發機制 1.2 執行流程1.3 啟動時加載 2、AOF持久化2.1 開啟AOF2.2 執行流程(1) 命令追加(append)(2) 文件寫入(write)和文件同步…

讀書筆記-三國演義-荊州爭奪

荊州爭奪 赤壁之戰后&#xff0c;荊州成為蜀漢、曹魏和孫吳三方爭奪的焦點。劉備、曹操和孫權相繼占據荊州&#xff0c;展開了一系列激烈的軍事沖突和政治斗爭。 赤壁之戰后的荊州爭奪是三國時期曹操、劉備和孫權之間的一場激烈競爭&#xff0c;是繼赤壁之戰后三方勢力之間的…

網絡編程筆記

網絡編程 1.網絡編程常用工具 1.掃描器 每一個網絡編程者手中都有一兩個用得順手的掃描器&#xff0c;掃描器在一個老練的網絡編程者手里有著相當大的作用。利用掃描器&#xff0c;網絡編程者可以對某一網段的機器或是某臺目標機器進行快速漏洞掃描&#xff0c;因為傳統的手…

langchain學習筆記(十)

Bind runtime args | &#x1f99c;?&#x1f517; Langchain 1、有時&#xff0c;我們希望使用常量參數調用Runnable序列中的Runnable&#xff0c;這些參數不是序列中前一個Runnable的輸出的一部分&#xff0c;也不是用戶的輸入&#xff0c;這時可以用Runnable.bind() from …