LeetCode【劍指offer】系列(動態規劃篇)

劍指offer10-I.斐波那契數列

題目鏈接

題目:斐波那契數(通常用F(n)表示)形成的序列稱為斐波那契數列 。該數列由 0 和 1 開始,后面的每一項數字都是前面兩項數字的和。也就是:

F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1

給定n ,請計算 F(n)

答案需要取模1e9+7(1000000007) ,如計算初始結果為:1000000008,請返回1。

思路:雖然矩陣快速冪也能做,但是這里用動態規劃。

通過代碼:

class Solution {
public:int fib(int n) {if(n < 2)return n;int mod = 1e9 + 7;int a = 0, b = 1;int res;for(int i = 0; i < n - 1; i++){res = (a + b) % mod;a = b;b = res;}return res;}
};

劍指offer10-II.青蛙跳臺階問題

題目鏈接

題目:今天的有氧運動訓練內容是在一個長條形的平臺上跳躍。平臺有num個小格子,每次可以選擇跳一個格子或者兩個格子。請返回在訓練過程中,學員們共有多少種不同的跳躍方式。

結果可能過大,因此結果需要取模 1e9+7(1000000007),如計算初始結果為:1000000008,請返回 1。

思路:本質上和上一題一樣。

通過代碼:

class Solution {
public:int trainWays(int num) {if(num < 2)return 1;int mod = 1e9 + 7;int a = 1, b = 1;int res;for(int i = 0; i < num - 1; i++){res = (a + b) % mod;a = b;b = res;}return res;}
};

劍指offer19.正則表達式匹配

題目鏈接

題目:請設計一個程序來支持用戶在文本編輯器中的模糊搜索功能。用戶輸入內容中可能使用到如下兩種通配符:

  • '.'匹配任意單個字符。
  • '*'匹配零個或多個前面的那一個元素。

請返回用戶輸入內容 input 所有字符是否可以匹配原文字符串 article

思路:見Leetcode題解

通過代碼:

class Solution {
public:bool articleMatch(string s, string p) {int m = s.size() + 1, n = p.size() + 1;vector<vector<bool>> dp(m, vector<bool> (n, false));dp[0][0] = true;for(int i = 2; i < n; i += 2)dp[0][i] = dp[0][i - 2] && p[i - 1] == '*';for(int i = 1; i < m; i++)for(int j = 1; j < n; j++){if(p[j - 1] == '*')dp[i][j] = dp[i][j - 2] || dp[i - 1][j] && s[i - 1] == p[j - 2] || dp[i - 1][j] && p[j - 2] == '.';elsedp[i][j] = dp[i - 1][j - 1] && s[i - 1] == p[j - 1] || dp[i - 1][j - 1] && p[j - 1] == '.';}return dp[m - 1][n - 1];}
};

劍指offer42.連續子數組的最大和

題目鏈接

題目:某公司每日銷售額記于整數數組sales,請返回所有連續一或多天銷售額總和的最大值。

要求實現時間復雜度為O(n)的算法。

思路:dp[i]表示以第i天結尾的子數組的最大和。從第i-1天轉移到第i天有兩種選擇:(1)第i天接在前一段得到最大和為dp[i-1] + sales[i],(2)第i天單獨成段,最大和為sales[i],二者取較大值完成狀態轉移即可。最后,遍歷過程中用res記錄最大值即可。

通過代碼:

class Solution {
public:int maxSales(vector<int>& sales) {vector<int> dp(sales.size());dp[0] = sales[0];int res = dp[0];for(int i = 1; i < sales.size(); i++){dp[i] = max(dp[i - 1] + sales[i], sales[i]);res = max(res, dp[i]);}return res;}
};

劍指offer46.把數字翻譯成字符串

題目鏈接

題目:現有一串神秘的密文ciphertext,經調查,密文的特點和規則如下:

  • 密文由非負整數組成
  • 數字0-25分別對應字母a-z

請根據上述規則將密文ciphertext解密為字母,并返回共有多少種解密結果。

思路:首先需要注意,包含前導0不屬于合法密文,即01這種無法解密為字母b。dp[i]表示前i個數字的解密結果種數,對于當前數字s[i-1],它可以選擇單獨作為一個密文,也可以選擇和s[i-2]合成一個兩位數作為密文。合成兩位數需要判斷其數值范圍是否在10-25之間。

通過代碼:

class Solution {
public:int crackNumber(int ciphertext) {string s = to_string(ciphertext);vector<int> dp(s.size() + 1);dp[0] = 1;dp[1] = 1;for(int i = 2; i < dp.size(); i++){string alph = s.substr(i - 2, 2);int num = stoi(alph);if(num >= 10 && num <= 25)dp[i] = dp[i - 1] + dp[i - 2];elsedp[i] = dp[i - 1];}return dp[s.size()];}
};

劍指offer47.禮物的最大值

題目鏈接

題目:現有一個記作二維矩陣frame的珠寶架,其中frame[i][j] 為該位置珠寶的價值。拿取珠寶的規則為:

  • 只能從架子的左上角開始拿珠寶
  • 每次可以移動到右側或下側的相鄰位置
  • 到達珠寶架子的右下角時,停止拿取

注意:珠寶的價值都是大于 0 的。除非這個架子上沒有任何珠寶,比如frame = [[0]]

思路:dp[i][j]表示走到該位置時的最大價值。要想到達dp[i][j],只能從上面或者左側到達,因此,取其二者中的最大值加上當前位置的價值即可。

通過代碼:

class Solution {
public:int jewelleryValue(vector<vector<int>>& frame) {int n = frame.size(), m = frame[0].size();vector<vector<int>> dp(n + 1, vector<int> (m + 1));for(int i = 1; i <= n; i++)for(int j = 1; j <= m; j++)dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + frame[i - 1][j - 1];return dp[n][m];}
};

劍指offer60.n個骰子的點數

題目鏈接

題目:你選擇擲出 num 個色子,請返回所有點數總和的概率。

你需要用一個浮點數數組返回答案,其中第 i 個元素代表這 num 個骰子所能擲出的點數集合中第 i 小的那個的概率。

思路:dp[i][j]表示色子個數為i時第j小的點數的概率,即dp[num]為所需要范圍的答案。已知dp[1]的各個點數的概率為1/6,所以對dp[1]進行相應的初始化。已知i-1個色子的概率,需要將狀態轉移到i個色子。由于多了一個色子,這個色子的點數只能為1-6,且概率分別為1/6。對于dp[i-1][j],加上多的色子的點數,就是對dp[i]造成的影響。收集這種影響即可完成狀態轉移。

通過代碼:

class Solution {
public:vector<double> statisticsProbability(int num) {vector<vector<double>> dp(num + 1, vector<double> (5 * num + 1));for(int i = 0; i < 6; i++)dp[1][i] = 1.0 / 6.0;for(int i = 2; i <= num; i++){for(int j = 0; j < 5 * (i - 1) + 1; j++){for(int k = 0; k < 6; k++)dp[i][j + k] += dp[i - 1][j] / 6.0;}}return dp[num];}
};

劍指offer62.圓圈中最后剩下的數字

題目鏈接

題目:社團共有num位成員參與破冰游戲,編號為0 ~ num-1。成員們按照編號順序圍繞圓桌而坐。社長抽取一個數字target,從 0 號成員起開始計數,排在第 target位的成員離開圓桌,且成員離開后從下一個成員開始計數。請返回游戲結束時最后一位成員的編號。

思路:約瑟夫環問題。

通過代碼:

class Solution {
public:int iceBreakingGame(int num, int target) {int res = 0;for(int i = 2; i <= num; i++)res = (res + target) % i;return res;}
};

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

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

相關文章

JVM 內存分配策略

引言 在 Java 虛擬機&#xff08;JVM&#xff09;中&#xff0c;內存分配與垃圾回收是影響程序性能的核心機制。內存分配的高效性直接決定了對象創建的速率&#xff0c;而垃圾回收策略則決定了內存的利用率以及系統的穩定性。為了在復雜多變的應用場景中實現高效的內存管理&am…

【二分查找】尋找峰值(medium)

6. 尋找峰值&#xff08;medium&#xff09; 題?描述&#xff1a;解法?&#xff08;?分查找算法&#xff09;&#xff1a;算法思路&#xff1a;C 算法代碼&#xff1a;Java 算法代碼&#xff1a; 題?鏈接&#xff1a;162. 尋找峰值 題?描述&#xff1a; 峰值元素是指其值…

MongoDB與PHP7的集成與優化

MongoDB與PHP7的集成與優化 引言 隨著互聯網技術的飛速發展,數據庫技術在現代軟件開發中扮演著越來越重要的角色。MongoDB作為一種流行的NoSQL數據庫,以其靈活的數據模型和強大的擴展性受到眾多開發者的青睞。PHP7作為當前最流行的服務器端腳本語言之一,其性能和穩定性也得…

【GIT】github中的倉庫如何刪除?

你可以按照以下步驟刪除 GitHub 上的倉庫&#xff08;repository&#xff09;&#xff1a; &#x1f6a8; 注意事項&#xff1a; ??刪除倉庫是不可恢復的操作&#xff0c;所有代碼、issue、pull request、release 等內容都會被永久刪除。 &#x1f9ed; 刪除 GitHub 倉庫步驟…

焊接機排錯

焊接機 一、前定位后焊接 兩個機臺&#xff0c;①極柱定位&#xff0c;相機定位所有極柱點和mark點&#xff1b;②焊接機&#xff0c;相機定位mark點原理&#xff1a;極柱定位在成功定位到所有極柱點和mark點后&#xff0c;可以建立mark點和極柱點的關系。焊接機定位到mark點…

認識和使用Vuex-案例

集中管理共享的數據&#xff0c;易于開發和后期維護&#xff1b;能夠高效的實現組件之間的數據共享&#xff0c;提高開發效率&#xff1b;存儲在Vuex的數據是響應式的&#xff0c;能夠實時保持頁面和數據的同步&#xff1b; 安裝Vuex依賴包 npm install vuex --save導入包 im…

LLM大模型中的基礎數學工具—— 信號處理與傅里葉分析

Q51: 推導傅里葉變換 的 Parseval 定理 傅里葉變換的 Parseval 定理揭示了啥關系&#xff1f; Parseval 定理揭示了傅里葉變換中時域與頻域的能量守恒關系&#xff0c;即信號在時域的總能量等于其在頻域的總能量。這就好比一個物體無論從哪個角度稱重&#xff0c;重量始終不…

對Mac文字雙擊或三擊鼠標左鍵沒有任何反應

目錄 項目場景&#xff1a; 問題描述 原因分析&#xff1a; 解決方案&#xff1a; 項目場景&#xff1a; 在使用Mac系統的時候&#xff0c;使用Apple無線鼠標&#xff0c;雙擊左鍵能夠選取某個單詞或詞語&#xff0c;三擊左鍵能夠選取某一行&#xff0c;&#xff08;百度、…

Go語言企業級項目使用dlv調試

使用dlv調試Go語言代碼 打包Go代碼(禁止優化和內聯&#xff08;便于調試更復雜的邏輯&#xff09;)&#xff1a; go build -gcflags"all-N -l" -o xxx_api_debug.exe啟動一個dlb監聽可運行程序的端口&#xff1a; dlv --listen:2345 --headlesstrue --api-version…

Kafka命令行的使用/Spark-Streaming核心編程(二)

Kafka命令行的使用 創建topic kafka-topics.sh --create --zookeeper node01:2181,node02:2181,node03:2181 --topic test1 --partitions 3 --replication-factor 3 分區數量&#xff0c;副本數量&#xff0c;都是必須的。 數據的形式&#xff1a; 主題名稱-分區編號。 在…

Python3:Jupyterlab 安裝和配置

Python3:Jupyterlab 安裝和配置 Jupyter源于Ipython Notebook項目&#xff0c;是使用Python&#xff08;也有R、Julia、Node等其他語言的內核&#xff09;進行代碼演示、數據分析、機器學習、可視化、教學的非常好的工具。 最新的基于web的交互式開發環境&#xff0c;適用于n…

快速排序及其在Unity游戲開發中的應用

一、快速排序(Quick Sort) 快速排序是一種**分治法(Divide and Conquer)**思想的排序算法,它的基本步驟是: 選一個基準元素(pivot):通常選第一個元素、最后一個元素,或者隨機一個。分區(Partition):把數組分成兩部分,小于等于 pivot 的放左邊,大于 pivot 的放右…

【硬核干貨】SonarQube安全功能

原文鏈接&#xff1a;【硬核干貨】SonarQube安全功能 關于曉數神州 曉數神州堅持以“客戶為中心”的宗旨&#xff0c;為客戶提供專業的解決方案和技術服務&#xff0c;構建多引擎數字化體系。 核心業務1&#xff1a;聚焦DevOps全棧產品&#xff0c;打造需求管理、項目管理、開…

修改el-select背景顏色

修改el-select背景顏色 /* 修改el-select樣式--直接覆蓋默認樣式&#xff08;推薦&#xff09; */ ::v-deep .el-select .el-input__inner {background-color: #1d2b72 !important; /* 修改輸入框背景色 */color: #fff; } ::v-deep .el-select .el-input__wrapper {background-…

Unity-粒子系統:螢火蟲粒子特效效果及參數

螢火蟲特效由兩部分組成。螢火蟲粒子底色粒子面片。螢火蟲的旋轉飛動主要由 Noise參數和Color over Lifetime模塊控制。 貼圖&#xff1a;中間實周邊虛的圓&#xff0c;可隨意自行制作 Shader&#xff1a;Universal Render Pipeline/2D/Sprite-Lit-Default 以下是粒子詳細參…

K8S Service 原理、圖例——深度好文

一、理論介紹 1.1、3W 法則 1、是什么&#xff1f; Service 是一種為一組功能相同的 pod 提供單一不變的接入點的資源。當 Service 存在時&#xff0c;它的IP地址和端口不會改變。客戶端通過IP地址和端口號與 Service 建立連接&#xff0c;這些連接會被路由到提供該 Service 的…

Alibaba Cloud Linux 3.2104 LTS 64位 容器優化版安裝docker docker compose記錄

整個安裝過程耗時4小時。&#xff08;包含以下檢查內容:&#xff09; 檢查該linux版本信息&#xff08;并通過監控指標檢查運行狀態/cpu占用/內存占用/磁盤讀取寫入IOPS /同時連接數&#xff09; 1&#xff1a;根據當前的系統進行yum與dnf的升級&#xff0c;保持穩定修復的版本…

STM32N6570-DK ISP調試

STM32N6570-DK之ISP調試應用 準備工作-下載安裝軟件包:一、使用STM32CubeProgrammer給板子燒入STM32N6_ISP_IQTune_App_revC01-v1.1.0-trusted.bin。二、打開STM32 ISP IQTune.exe ,出現可連接端口:三、根據教程進行相應調試:準備工作-下載安裝軟件包: https://www.st.co…

12.thinkphp驗證

一&#xff0e;驗證器定義 1. 驗證器的使用&#xff0c;我們必須先定義它&#xff0c;系統提供了一條命令直接生成想要的類&#xff1b; php think make:validate User 2. 這條命令會自動在應用目錄下生成一個validate文件夾&#xff0c;并生成User.php類&#xff1b; class…

OpenWrt 與 Docker:打造輕量級容器化應用平臺技術分享

文章目錄 前言一、OpenWrt 與 Docker 的集成前提1.1 硬件與內核要求1.2 軟件依賴 二、Docker 環境部署與驗證2.1 基礎服務配置2.2 存儲驅動適配 三、容器化應用部署實踐3.1 資源限制策略3.2 Docker Compose 適配 四、性能優化與監控4.1 容器資源監控4.2 鏡像精簡策略 五、典型問…