代碼隨想錄算法訓練營第45天| 70. 爬樓梯 (進階) 322. 零錢兌換 279.完全平方數

JAVA代碼編寫

70. 爬樓梯(進階版)

卡碼網:57. 爬樓梯(第八期模擬筆試)

題目描述

假設你正在爬樓梯。需要 n 階你才能到達樓頂。

每次你可以爬至多m (1 <= m < n)個臺階。你有多少種不同的方法可以爬到樓頂呢?

注意:給定 n 是一個正整數。

輸入描述

輸入共一行,包含兩個正整數,分別表示n, m

輸出描述

輸出一個整數,表示爬到樓頂的方法數。

輸入示例
3 2
輸出示例
3
提示信息
數據范圍:
1 <= m < n <= 32;
當 m = 2,n = 3 時,n = 3 這表示一共有三個臺階,m = 2 代表你每次可以爬一個臺階或者兩個臺階。
此時你有三種方法可以爬到樓頂。
1. 1 階 + 1 階 + 1 階段
2. 1 階 + 2 階
3. 2 階 + 1 階

教程:https://programmercarl.com/0070.%E7%88%AC%E6%A5%BC%E6%A2%AF%E5%AE%8C%E5%85%A8%E8%83%8C%E5%8C%85%E7%89%88%E6%9C%AC.html#%E6%80%9D%E8%B7%AF

方法一:動態規劃

思路:和70. 爬樓梯很像,基礎的是每次只能走1個或2個臺階,現在改成能走1-m中任意一個臺階。問有多少種方法走完n階樓梯。

步驟

  1. 定義dp數組:dp[j]: 爬到第j層樓梯,有dp[j]種方法

  2. 遞推公式:dp[j] = dp[j - 1] + dp[j - 2] + … +dp[j - m]

    • dp[j - 1],上j-1層樓梯,有dp[j - 1]種方法,那么再1步跳一個臺階不就是dp[j]了么。
    • dp[j - 2],上j-2層樓梯,有dp[j - 2]種方法,那么再2步跳兩個臺階不就是dp[j]了么。
    • dp[j - m],上j-m層樓梯,有dp[j - m]種方法,那么再m步跳兩個臺階不就是dp[j]了么。
      可以這樣理解。因為每次只能走1個樓梯或2個樓梯…或m個樓梯,那么我們要走j個樓梯,可以從第j-m個樓梯,再走m個樓梯;…;也可以從第j-1個樓梯,再走1個樓梯。所以dp[j] = dp[j - 1] + dp[j - 2] + … +dp[j - m]
  3. dp數組初始化:dp[1]=1,dp[2]=2

  4. 確定遍歷順序:遍歷n,再遍歷m

  5. 舉例推導dp數組n=4,m=2

在這里插入圖片描述

簡單來說,dp[j]等于前m個dp的和,這里的dp[4]=dp[3]+dp[2],剛好是2個的和。

復雜度分析

  • 時間復雜度:O(n * m)
  • 空間復雜度:O(n)
import java.util.Scanner;class Solution{public static void main(String [] args){Scanner sc = new Scanner(System.in);int m, n;while (sc.hasNextInt()) {// 從鍵盤輸入參數,中間用空格隔開n = sc.nextInt();m = sc.nextInt();// 求排列問題,先遍歷背包再遍歷物品int[] dp = new int[n + 1];dp[0] = 1;for (int j = 1; j <= n; j++) {for (int i = 1; i <= m; i++) {if (j - i >= 0) dp[j] += dp[j - i];}}System.out.println(dp[n]);}}
}

322. 零錢兌換

給你一個整數數組 coins ,表示不同面額的硬幣;以及一個整數 amount ,表示總金額。

計算并返回可以湊成總金額所需的 最少的硬幣個數 。如果沒有任何一種硬幣組合能組成總金額,返回 -1

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

示例 1:

輸入:coins = [1, 2, 5], amount = 11
輸出:3 
解釋:11 = 5 + 5 + 1

示例 2:

輸入:coins = [2], amount = 3
輸出:-1

示例 3:

輸入:coins = [1], amount = 0
輸出:0

提示:

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

教程:https://programmercarl.com/0322.%E9%9B%B6%E9%92%B1%E5%85%91%E6%8D%A2.html

方法一:動態規劃

思路:五步曲

步驟

  1. 定義dp [j]:湊成和為amount的最少硬幣個數為dp[j]

  2. 遞推公式:

    湊足總額為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]);

  3. dp數組初始化:dp[0] =0,考慮到遞推公式的特性,dp[j]必須初始化為一個最大的數,否則就會在min(dp[j - coins[i]] + 1, dp[j])比較的過程中被初始值覆蓋。

  4. 確定遍歷順序:

    本題求錢幣最小個數,那么錢幣有順序和沒有順序都可以,都不影響錢幣的最小個數

    所以本題并不強調集合是組合還是排列。

    如果求組合數就是外層for循環遍歷物品,內層for遍歷背包

    如果求排列數就是外層for遍歷背包,內層for循環遍歷物品

  5. 舉例推導dp數組,

    以輸入:coins = [1, 2, 5], amount = 5為例

在這里插入圖片描述

復雜度分析

  • 時間復雜度:O(n * amount),n 為coins長度
  • 空間復雜度:O(amount)
class Solution {public int coinChange(int[] coins, int amount) {int max = Integer.MAX_VALUE;int[] dp = new int[amount + 1];//初始化dp數組為最大值for (int j = 0; j < dp.length; j++) {dp[j] = max;}//當金額為0時需要的硬幣數目為0dp[0] = 0;for (int i = 0; i < coins.length; i++) {//正序遍歷:完全背包每個硬幣可以選擇多次for (int j = coins[i]; j <= amount; j++) {//只有dp[j-coins[i]]不是初始最大值時,該位才有選擇的必要if (dp[j - coins[i]] != max) {//選擇硬幣數目最小的情況dp[j] = Math.min(dp[j], dp[j - coins[i]] + 1);}}}return dp[amount] == max ? -1 : dp[amount];}public static void main(String[] args) {Solution solution = new Solution();solution.coinChange(new int[] {1,2,5},5);}
}

從貪心的角度看,每次放最大的硬幣,一直放,直到amount剩下為amount%最大硬幣值,接著放次大或能直接整除的硬幣。

class Solution {public int coinChange(int[] coins, int amount) {if (amount == 0) return 0;if (coins.length == 1 && amount % coins[0] != 0) return -1;int count = 0;Arrays.sort(coins);for (int i = coins.length - 1; i >= 0; i--) {count += amount / coins[i];amount = amount % coins[i];if (amount == 0) {return count;}}return -1;}
}

但是這個代碼不能通過,貪心不能通過局部最優獲取全局最優。

279. 完全平方數

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

完全平方數 是一個整數,其值等于另一個整數的平方;換句話說,其值等于一個整數自乘的積。例如,14916 都是完全平方數,而 311 不是。

示例 1:

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

示例 2:

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

提示:

  • 1 <= n <= 104

教程:https://programmercarl.com/0279.%E5%AE%8C%E5%85%A8%E5%B9%B3%E6%96%B9%E6%95%B0.html#_279-%E5%AE%8C%E5%85%A8%E5%B9%B3%E6%96%B9%E6%95%B0

方法一:動態規劃

思路:完全平方數就是物品(可以無限件使用),湊個正整數n就是背包,問湊滿這個背包最少有多少物品?

完全背包

步驟

  1. 定義dp [j]:和為j的完全平方數的最少數量為dp[j]

  2. 遞推公式:

    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]);

  3. dp數組初始化:dp[0] =0,dp[j]賦最大值

  4. 確定遍歷順序:

    兩者都可:

    如果求組合數就是外層for循環遍歷物品,內層for遍歷背包

    如果求排列數就是外層for遍歷背包,內層for循環遍歷物品

  5. 舉例推導dp數組,

    已輸入n為5例,dp狀態圖如下:

279.完全平方數

復雜度分析

  • 時間復雜度:O(n*sqrt(n))
  • 空間復雜度:O(n)
class Solution {// 版本一,先遍歷物品, 再遍歷背包public int numSquares(int n) {int max = Integer.MAX_VALUE;int[] dp = new int[n + 1];//初始化for (int j = 0; j <= n; j++) {dp[j] = max;}//如果不想要寫for-loop填充數組的話,也可以用JAVA內建的Arrays.fill()函數。//Arrays.fill(dp, Integer.MAX_VALUE);//當和為0時,組合的個數為0dp[0] = 0;// 遍歷物品for (int i = 1; i * i <= n; i++) {// 遍歷背包for (int j = i * i; j <= n; j++) {//if (dp[j - i * i] != max) {dp[j] = Math.min(dp[j], dp[j - i * i] + 1);//}//不需要這個if statement,因爲在完全平方數這一題不會有"湊不成"的狀況發生( 一定可以用"1"來組成任何一個n),故comment掉這個if statement。}}return dp[n];}
}class Solution {// 版本二, 先遍歷背包, 再遍歷物品public int numSquares(int n) {int max = Integer.MAX_VALUE;int[] dp = new int[n + 1];// 初始化for (int j = 0; j <= n; j++) {dp[j] = max;}// 當和為0時,組合的個數為0dp[0] = 0;// 遍歷背包for (int j = 1; j <= n; j++) {// 遍歷物品for (int i = 1; i * i <= j; i++) {dp[j] = Math.min(dp[j], dp[j - i * i] + 1);}}return dp[n];}
}

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

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

相關文章

菜鳥學習日記(python)——推導式

python中的推導式是一種獨特的數據處理方式&#xff0c;可以從一個數據序列去構建另一個新的數據序列的結構體。 它包括以下推導式&#xff1a; 列表&#xff08;list&#xff09;推導式字典&#xff08;dict&#xff09;推導式集合&#xff08;set&#xff09;推導式元組&am…

Multi-Cell Downlink Beamforming: Direct FP, Closed-Form FP, Weighted MMSE

這里寫自定義目錄標題 Direct FPClosed-Form FPthe Lagrangian functionthe Lagrange dual function: maximizing the Lagrangianthe Lagrange dual problem: minimizing the Lagrange dual functionClosed-Form FP Weighted MMSE原論文 Lagrange dual5.1.1 The Lagrangian5.1.…

阿里云服務器經濟型、通用算力型、計算型、通用型、內存型實例區別及選擇參考

當我們通過阿里云的活動購買云服務器會發現&#xff0c;相同配置的云服務器往往有多個不同的實例可選&#xff0c;而且價格差別也比較大&#xff0c;例如同樣是4核8G的配置的云服務器&#xff0c;經濟型e實例活動價格只要1500.48/1年起&#xff0c;通用算力型u1實例要1795.97/1…

nvidia安裝出現7-zip crc error解決辦法

解決辦法&#xff1a;下載network版本&#xff0c;重新安裝。&#xff08;選擇自己需要的版本&#xff09; 網址&#xff1a;CUDA Toolkit 12.3 Update 1 Downloads | NVIDIA Developer 分析原因&#xff1a;local版本的安裝包可能在下載過程中出現損壞。 本人嘗試過全網說的…

linux 系統安全基線 安全加固操作

目錄 用戶口令設置 root用戶遠程登錄限制 檢查是否存在除root之外UID為0的用戶 ???????root用戶環境變量的安全性 ???????遠程連接的安全性配置 ???????用戶的umask安全配置 ???????重要目錄和文件的權限設置 ???????找未授權的SUID…

json轉yolo格式

json轉yolo格式 視覺分割得一些標注文件是json格式&#xff0c;比如&#xff0c;舌頭將這個舌頭區域分割出來&#xff08;用mask二值圖的形式&#xff09;&#xff0c;對舌頭的分割第一步是需要檢測出來&#xff0c;缺少數據集&#xff0c;可以使用分割出來的結果&#xff0c;將…

無公網IP環境如何SSH遠程連接Deepin操作系統

文章目錄 前言1. 開啟SSH服務2. Deppin安裝Cpolar3. 配置ssh公網地址4. 公網遠程SSH連接5. 固定連接SSH公網地址6. SSH固定地址連接測試 前言 Deepin操作系統是一個基于Debian的Linux操作系統&#xff0c;專注于使用者對日常辦公、學習、生活和娛樂的操作體驗的極致&#xff0…

數據儀表盤設計:可視化數據指標和報告

寫在開頭 在信息爆炸的時代,數據不再是簡單的數字和圖表,而是一種有機的信息體系。如何將這些琳瑯滿目的數據以一種直觀而高效的方式展示,成為企業決策者和分析師們共同關注的問題。本文將帶您深入學習如何設計和創建數據儀表盤,使數據指標和報告以一目了然的方式呈現。 …

Python---time庫

目錄 時間獲取 時間格式化 程序計時 time庫包含三類函數&#xff1a; 時間獲取&#xff1a;time() ctime() gmtime() 時間格式化&#xff1a;strtime() strptime() 程序計時&#xff1a;sleep() perf_counter() 下面逐一介紹&#…

H3.3K27M彌漫性中線膠質瘤的反義寡核苷酸治療

今天給同學們分享一篇實驗文章“Antisense oligonucleotide therapy for H3.3K27M diffuse midline glioma”&#xff0c;這篇文章發表在Sci Transl Med期刊上&#xff0c;影響因子為17.1。 結果解讀&#xff1a; CRISPR-Cas9消耗H3.3K27M恢復了H3K27三甲基化&#xff0c;并延…

Echarts地圖案例及常見問題

前言 ECharts 是一個使用 JavaScript 實現的開源可視化庫,它可以幫助用戶以簡單的方式創建復雜的時間序列、條形圖、餅圖、地圖等圖形。 Echarts繪制地圖的案例 展示了中國各省份的人口數量 var myChart = echarts.init(document.getElementById(main)); var option = {t…

【TailwindCSS】

TailwindCSS作為一種現代化的CSS框架&#xff0c;以其高度的定制性和靈活性受到前端開發者的青睞。本文旨在提供一份詳細的TailwindCSS使用教程&#xff0c;特別適用于Vite和Vue框架的組合。 我們將從安裝開始&#xff0c;深入探討如何在項目中有效利用TailwindCSS的各項功能&…

在AWS Lambda上部署標準FFmpeg工具——Docker方案

大綱 1 確定Lambda運行時環境1.1 Lambda系統、鏡像、內核版本1.2 運行時1.2.1 Python1.2.2 Java 2 啟動EC23 編寫調用FFmpeg的代碼4 生成docker鏡像4.1 安裝和啟動Docker服務4.2 編寫Dockerfile腳本4.3 生成鏡像 5 推送鏡像5.1 創建存儲庫5.2 給EC2賦予角色5.2.1 創建策略5.2.2…

【帶頭學C++】----- 九、類和對象 ---- 9.10 C++設計模式之單例模式設計

??????????????????????麻煩您點個關注&#xff0c;不迷路???????????????????????? 目 錄 9.10 C設計模式之單例模式設計 舉例說明&#xff1a; 9.10 C設計模式之單例模式設計 看過我之前的文章的&#xff0c;簡單講解過C/Q…

遙測終端機RTU:實現遠程監測和控制的重要工具

遙測終端機RTU對設備進行遠程監測和控制&#xff0c;支持采集和傳輸數據&#xff0c;以實現對工業過程、公用事業、水文和環境的監測和管理。 遙測終端機RTU工作原理 計訊物聯遙測終端機RTU通過網口、串口進行傳感器/設備等現場數據采集&#xff0c;將其轉換為數字信號&#xf…

【LeetCode】202. 快樂數

202. 快樂數 難度&#xff1a;簡單 題目 編寫一個算法來判斷一個數 n 是不是快樂數。 「快樂數」 定義為&#xff1a; 對于一個正整數&#xff0c;每一次將該數替換為它每個位置上的數字的平方和。然后重復這個過程直到這個數變為 1&#xff0c;也可能是 無限循環 但始終變…

高校網站建設的效果如何

高校有較高的信息承載需求、招生宣傳、學校內容呈現、內部消息觸達等需求&#xff0c;對高校來說&#xff0c;如今互聯網深入生活各個場景&#xff0c;無論學校發展、外部拓展還是內部師生互動、通知觸達等都需要完善。 除了傳統傳單及第三方平臺展示外&#xff0c;學校構建屬…

C#-數組池減少GC工作

數組池減少GC工作 通過ArrayPool類&#xff08;名稱空間System.Buffers&#xff09;使用數組池&#xff0c;可減少垃圾收集器的工作&#xff0c;ArrayPool管理一個數組池&#xff0c;數組可以從這租借&#xff0c;并返回池中&#xff0c;內存在ArrayPool中管理。 創建ArrayPool…

Html5響應式全開源網站建站源碼系統 附帶完整的搭建教程

Html5響應式全開源網站建站源碼系統是基于Html5、CSS3和JavaScript等技術開發的全開源網站建站系統。它旨在為初學者和小型企業提供一套快速、簡便的網站建設解決方案。該系統采用響應式設計&#xff0c;可以自適應不同設備的屏幕大小&#xff0c;提高用戶體驗。同時&#xff0…

Clean My Mac X2024解鎖完整版本

Clean My Mac X是Mac上一款美觀易用的系統優化清理工具&#xff0c;也是小編剛開始用Mac時的裝機必備。垃圾需要時時清&#xff0c;電腦才能常年新。Windows的垃圾清理工具選擇有很多&#xff0c;但是Mac的清理工具可選擇的就很少。 今天給大家推薦大名鼎鼎的Clean My Mac X&a…