代碼隨想錄算法訓練營第48天| Leetcode 121. 買賣股票的最佳時機、Leetcode 122.買賣股票的最佳時機II

文章目錄

    • Leetcode 121. 買賣股票的最佳時機
    • Leetcode 122.買賣股票的最佳時機II

Leetcode 121. 買賣股票的最佳時機

題目鏈接: Leetcode 121. 買賣股票的最佳時機
題目描述: 給定一個數組 prices ,它的第 i 個元素 prices[i] 表示一支給定股票第 i 天的價格。你只能選擇某一天買入這只股票,并選擇在未來的某一個不同的日子賣出該股票。設計一個算法來計算你所能獲取的最大利潤。返回你可以從這筆交易中獲取的最大利潤。如果你不能獲取任何利潤,返回 0
思路: 本題可以用貪心來做,貪心策略:在最便宜的一天買入,然后在該天之后最高的一天(不一定是所有元素最大值)賣出。
代碼如下:(貪心)

class Solution {
public:int maxProfit(vector<int>& prices) {int low = INT_MAX;int result = 0;// 貪心策略:在最便宜的一天買入,然后在該天之后最高的一天(不一定是所有元素最大值)賣出for (int i = 0; i < prices.size(); i++) {low = min(low, prices[i]);             // 維護最小值result = max(result, prices[i] - low); // 求最大收益}return result;}
};
  • 時間復雜度: O ( n ) O(n) O(n)
  • 空間復雜度: O ( 1 ) O(1) O(1)

貪心的做法關鍵在于想到合適的貪心策略。如果沒想到貪心策略,本題也可以通過動態規劃來解決:

  • dp[i][0]: 表示第i天持有股票所得最多現金;dp[i][1] 表示第i天不持有股票所得最多現金
  • 遞推公式: 如果第i天持有股票,則有dp[i][0] = max(dp[i - 1][0], -prices[i]);如果第i天不持有股票,則有dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0])
  • 初始化: dp[0][0] = -prices[0]dp[0][1] = 0
  • 遍歷順序:從前向后遍歷

代碼如下:(dp)

class Solution {
public:int maxProfit(vector<int>& prices) {int n = prices.size();vector<vector<int>> dp(n, vector<int>(2));// dp[i][0]代表第i天持有股票;dp[i][1]代表第i天不持有股票dp[0][0] = -prices[0];dp[0][1] = 0;for (int i = 1; i < n; i++) {dp[i][0] = max(dp[i - 1][0], -prices[i]);dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0]);}return dp[n - 1][1]; // 無論如何最后都要賣出股票}
};
  • 時間復雜度: O ( n ) O(n) O(n)
  • 空間復雜度: O ( n ) O(n) O(n)

我們根據遞推公式發現,dp[i]只取決于dp[i - 1]的狀態,因此只需要大小為2的數組即可。
代碼如下:(dp+滾動數組優化)

class Solution {
public:int maxProfit(vector<int>& prices) {int n = prices.size();vector<vector<int>> dp(2, vector<int>(2));// dp[i][0]代表第i天持有股票;dp[i][1]代表第i天不持有股票dp[0][0] = -prices[0];dp[0][1] = 0;for (int i = 1; i < n; i++) {dp[i % 2][0] = max(dp[(i - 1) % 2][0], -prices[i]);dp[i % 2][1] = max(dp[(i - 1) % 2][1], prices[i] + dp[(i - 1) % 2][0]);}return dp[(n - 1) % 2][1]; // 無論如何最后都要賣出股票}
};
  • 時間復雜度: O ( n ) O(n) O(n)
  • 空間復雜度: O ( 1 ) O(1) O(1)

Leetcode 122.買賣股票的最佳時機II

題目鏈接: Leetcode 122.買賣股票的最佳時機II
題目描述: 給你一個整數數組 prices ,其中 prices[i] 表示某支股票第 i 天的價格。在每一天,你可以決定是否購買或出售股票。你在任何時候最多只能持有一股股票。你也可以先購買,然后在同一天出售。返回你能獲得的最大利潤 。
思路: 本題我之前用貪心實現過:可以看這里,因此這里主要介紹動態規劃的做法。

本題與上道題的動態規劃思路基本相同,唯一的區別在于:由于可以多次買賣股票,因此推導dp[i][0]時,需要考慮第i天買入股票的情況,單純用-prices[i]表示就不可以了。

  • dp[i][0]: 表示第i天持有股票所得最多現金;dp[i][1] 表示第i天不持有股票所得最多現金
  • 遞推公式: 如果第i天持有股票,則有dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]);如果第i天不持有股票,則有dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0])
  • 初始化: dp[0][0] = -prices[0]dp[0][1] = 0
  • 遍歷順序:從前向后遍歷

代碼如下:(dp)

class Solution {
public:int maxProfit(vector<int>& prices) {int n = prices.size();vector<vector<int>> dp(n, vector<int>(2));// dp[i][0]代表第i天持有股票;dp[i][1]代表第i天不持有股票dp[0][0] = -prices[0];dp[0][1] = 0;for (int i = 1; i < n; i++) {dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]);//與121的唯一區別dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i]);}return dp[n - 1][1];}
};
  • 時間復雜度: O ( n ) O(n) O(n)
  • 空間復雜度: O ( n ) O(n) O(n)

代碼如下:(dp+滾動數組優化)

class Solution {
public:int maxProfit(vector<int>& prices) {int n = prices.size();vector<vector<int>> dp(2, vector<int>(2));// dp[i][0]代表第i天持有股票;dp[i][1]代表第i天不持有股票dp[0][0] = -prices[0];dp[0][1] = 0;for (int i = 1; i < n; i++) {dp[i % 2][0] = max(dp[(i - 1) % 2][0], dp[(i - 1) % 2][1] - prices[i]);dp[i % 2][1] = max(dp[(i - 1) % 2][1], dp[(i - 1) % 2][0] + prices[i]);}return dp[(n - 1) % 2][1];}
};
  • 時間復雜度: O ( n ) O(n) O(n)
  • 空間復雜度: O ( 1 ) O(1) O(1)

總結: 這兩道題不算難,不過需要理解好兩道題的遞推公式,不僅要知其然,還要知其所以然。

最后,如果文章有錯誤,請在評論區或私信指出,讓我們共同進步!

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

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

相關文章

W5300驅動說明

W5300是一款帶有硬件協議棧的網絡芯片&#xff0c;內部擁有128K的緩存&#xff0c;最大支持8路socket通信&#xff0c;與MCU之間通過16位數據總線通信&#xff0c;通信速度遠超W5500之類以SPI作為通信接口的網絡芯片&#xff0c;特別適合對高速網絡傳輸有需求的應用。 本次使用…

使用 helm repo add istio添加了一個helm chart repo,如何查看istio的版本呢

1. 添加chart repo helm repo add istio https://istio-release.storage.googleapis.com/charts helm repo update2. 查看版本 helm search repo istio 3. 查看版本詳細信息 helm show chart istio/cni 4. 查看某個chart的歷史版本 helm search repo <chart-name> --…

【Linux】信號的保存

&#x1f34e;個人博客&#xff1a;個人主頁 &#x1f3c6;個人專欄&#xff1a;Linux ?? 功不唐捐&#xff0c;玉汝于成 目錄 前言 正文 信號在Linux中的保存主要涉及方面 信號的類型&#xff1a; 信號處理程序&#xff1a; 信號的傳遞和處理&#xff1a; 信號的阻…

面試官:你用過Collections工具類嗎?

Collections工具類 1. 常用的 Collections 方法2. 代碼示例 Java中的 Collections 工具類提供了一系列靜態方法&#xff0c;用于對集合進行各種操作&#xff0c;如排序、查找、替換等。下面我們來看一些 Collections 工具類中常用的API和使用示例。 1. 常用的 Collections 方…

回溯算法套路③排列型回溯+N皇后【基礎算法精講 16】

46 . 全排列 鏈接 : . - 力扣&#xff08;LeetCode&#xff09; 思路 : 那么怎么確定選了那個數呢? 這里設置一個used表示i選沒選過 ; class Solution { public:vector<vector<int>> ans;vector<int> path;void backtrack(vector<int>nums,vect…

2024年【天津市安全員B證】考試內容及天津市安全員B證實操考試視頻

題庫來源&#xff1a;安全生產模擬考試一點通公眾號小程序 天津市安全員B證考試內容根據新天津市安全員B證考試大綱要求&#xff0c;安全生產模擬考試一點通將天津市安全員B證模擬考試試題進行匯編&#xff0c;組成一套天津市安全員B證全真模擬考試試題&#xff0c;學員可通過…

《Improving Calibration for Long-Tailed Recognition》閱讀筆記

論文標題 《Improving Calibration for Long-Tailed Recognition》 改進長尾識別的校準工作 作者 Zhisheng Zhong、 Jiequan Cui、Shu Liu 和 Jiaya Jia 香港中文大學和 SmartMore 初讀 摘要 深度神經網絡在訓練數據集類別極度不平衡時可能會表現不佳。最近&#xff0c…

pydub、playsound播放聲音;gradio、streamlit頁面播放聲音;gradio 頁面圖像、視頻及調用攝像頭

1、pydub from pydub import AudioSegment from pydub.playback import playsong AudioSegment.from_wav(r"C:\Users\loong\Downloads\zh.wav") play(song)2、playsound from playsound import playsoundplaysound(r"voice.wav")3、streamlit import s…

Linux學習:初識Linux

目錄 1. 引子&#xff1a;1.1 簡述&#xff1a;操作系統1.2 學習工具 2. Linux操作系統中的一些基礎概念與指令2.1 簡單指令2.2 ls指令與文件2.3 cd指令與目錄2.4 文件目錄的新建與刪除指令2.5 補充指令1&#xff1a;2.6 文件編輯與拷貝剪切2.7 文件的查看2.8 時間相關指令2.9 …

22.基于springboot + vue實現的前后端分離-汽車票網上預定系統(項目 + 論文PPT)

項目介紹 系統是一個B/S模式系統&#xff0c;采用Spring Boot框架&#xff0c;MySQL 數據庫設計開發&#xff0c;充分保證系統的穩定性。系統具有界面清晰、操作簡單&#xff0c;功能齊全的特點&#xff0c;使得汽車票網上預訂系統管理工作系統化、規范化。本系統的使用使管理人…

JavaScript作用域及預解析

文章目錄 1. 作用域介紹2. 變量的作用域*3. JS中沒有塊級作用域4. 作用域鏈5. 預解析預解析案例 1. 作用域介紹 全局作用域局部作用域相同的變量名稱在不同的作用域中是不會相互影響的&#xff01; 2. 變量的作用域 全局變量&#xff1a;在全局下都可以使用&#xff1b;局部變…

藍橋杯——外賣店優先級

外賣店優先級 題目分析 這一題一看N&#xff0c;M&#xff0c;T的范圍就知道不能暴力&#xff0c;要討巧&#xff0c;怎么討巧是重點。正常的思路是第一層for循環遍歷訂單&#xff08;或者外賣店&#xff09;&#xff0c;第二層for循環遍歷外賣店&#xff08;或者訂單&#x…

Vue中 computed 和 watch

在Vue框架中&#xff0c;computed和watch都用于響應數據的變化&#xff0c;但它們在使用上有著不同的側重點和機制。具體分析如下&#xff1a; 1. 功能差異 computed是計算屬性&#xff0c;它是基于它們的響應式依賴進行緩存的。只有當依賴的數據發生變化時&#xff0c;compu…

2827. 范圍中美麗整數的數目

文章目錄 題意思路代碼 題意 題目鏈接 思路 按位dp暴力 代碼 // 暴力 class Solution { public:int numberOfBeautifulIntegers(int low, int high, int k) {int l low / k;int r high / k;if (low % k)l;int ans 0;while (l < r){int tmp l * k;if (10 < tmp &…

華為數通方向HCIP-DataCom H12-821題庫(多選題:61-80)

第61題 ACL 可分為如下哪些類別? A.用戶自定義 ACL B.基本 ACL C.二層ACL D.高級ACL 【參考答案】ABCD 【答案解析】 A. 用戶自定義 ACL (User-defined ACL): 這是用戶根據自身需求自定義的 ACL,用于實現特定的訪問控制策略。B.基本 ACL (Standard ACL): 基本 ACL 是基于源 …

OCP Secure boot必要特性

三點必需要求&#xff1a; The platform components must: 1. Provide a mechanism for securely anchoring a root of trust public key. // 提供一種用于安全地錨定信任根公鑰的機制。 2. Verify the device firmware digital signature using the anchored public key /…

北京大學發布,將試錯引入大模型代理學習!

引言&#xff1a;探索語言智能的新邊界 在人工智能的發展歷程中&#xff0c;語言智能始終是一個核心的研究領域。隨著大語言模型&#xff08;LLM&#xff09;的興起&#xff0c;我們對語言智能的理解和應用已經邁入了一個新的階段。這些模型不僅能夠理解和生成自然語言&#x…

動態規劃(四)背包dp

01背包 完全背包 多重背包 二維費用背包 分組背包 混合背包

【算法分析與設計】組合

&#x1f4dd;個人主頁&#xff1a;五敷有你 &#x1f525;系列專欄&#xff1a;算法分析與設計 ??穩中求進&#xff0c;曬太陽 題目 給定兩個整數 n 和 k&#xff0c;返回范圍 [1, n] 中所有可能的 k 個數的組合。 你可以按 任何順序 返回答案。 示例 示例 1&…

25考研習題記錄

3月 湯家鳳《1800》 基礎篇 日期高等數學線性代數概率論3.1 P92-93 P212-214 3.4 P10-15 P10-19 極限題62題 P73-74 P170-172 行列式17題 考研競賽凱哥每日一題 張宇高數30講頁數3.4P74