leetcode【面試經典150系列】(一)

目錄

121.買賣股票最佳時機

題目描述

示例

算法分析

代碼(python3)

122.買賣股票最佳時機II

?題目描述

示例

算法分析

代碼(python3)

55.跳躍游戲

題目描述

示例

算法分析

代碼

45.跳躍游戲II

題目描述

示例

算法分析

代碼


121.買賣股票最佳時機

題目描述

給定一個數組 prices ,它的第?i 個元素?prices[i] 表示一支給定股票第 i 天的價格。

你只能選擇 某一天 買入這只股票,并選擇在 未來的某一個不同的日子 賣出該股票。設計一個算法來計算你所能獲取的最大利潤。

返回你可以從這筆交易中獲取的最大利潤。如果你不能獲取任何利潤,返回 0

示例

輸入:[7,1,5,3,6,4]
輸出:5
解釋:在第 2 天(股票價格 = 1)的時候買入,在第 5 天(股票價格 = 6)的時候賣出,最大利潤 = 6-1 = 5 。
? ? ?注意利潤不能是 7-1 = 6, 因為賣出價格需要大于買入價格;同時,你不能在買入前賣出股票。

這個問題實際上是利用了“貪心算法”的思想。

算法分析

這個算法的目的是找出股票交易中的最大利潤,即買入和賣出股票的最佳時機。算法的核心思想是:

  1. 維護一個最小值(mn):這個變量用于記錄遍歷過的價格中的最小值。這相當于我們在尋找買入股票的最佳時機(即價格最低的時候)。
  2. 計算利潤(ans):對于每一個價格,我們計算如果在這個價格賣出股票,那么利潤是多少(即當前價格減去之前記錄的最小值)。然后,我們更新記錄的最大利潤(ans)。

為什么說是貪心算法?

  • 局部最優選擇:在每一步,我們都選擇到目前為止看到的最小值作為可能的買入點,這是一個局部最優選擇,因為我們假設在這一點上買入可以最大化后續可能的利潤。
  • 無回溯:一旦我們選擇了某個點作為“可能的買入點”,我們就不會回頭去改變這個選擇(除非遇到一個更低的價格)。這符合貪心算法“一旦做出選擇,不再更改”的特點。

代碼(python3)

class Solution:def maxProfit(self, prices: List[int]) -> int:# mn用來記錄前n個最小的值mn = prices[0]# ans用來記錄前n個最小的值與當前值的差值的最大值ans = 0for x in prices:mn = min(mn,x)ans = max(ans,x-mn)return ans

122.買賣股票最佳時機II

?題目描述

給你一個整數數組 prices ,其中?prices[i] 表示某支股票第 i 天的價格。

在每一天,你可以決定是否購買和/或出售股票。你在任何時候?最多?只能持有 一股 股票。你也可以先購買,然后在 同一天 出售。

返回 你能獲得的 最大 利潤?

示例

輸入:prices = [7,1,5,3,6,4]
輸出:7
解釋:在第 2 天(股票價格 = 1)的時候買入,在第 3 天(股票價格 = 5)的時候賣出, 這筆交易所能獲得利潤 = 5 - 1 = 4。
隨后,在第 4 天(股票價格 = 3)的時候買入,在第 5 天(股票價格 = 6)的時候賣出, 這筆交易所能獲得利潤 = 6 - 3 = 3。
最大總利潤為 4 + 3 = 7 。

算法分析

遍歷數組,如果當天買入第二天會漲,就在第二天賣出。否則當天就不買入。這個方法,最終利潤是最大的。

代碼(python3)

class Solution:def maxProfit(self, prices: List[int]) -> int:profit = 0for i in range(1, len(prices)):tmp = prices[i] - prices[i - 1]if tmp > 0:profit += tmpreturn profit

55.跳躍游戲

題目描述

給你一個非負整數數組?nums ,你最初位于數組的 第一個下標 。數組中的每個元素代表你在該位置可以跳躍的最大長度。

判斷你是否能夠到達最后一個下標,如果可以,返回 true ;否則,返回 false 。

示例

輸入:nums = [2,3,1,1,4]
輸出:true
解釋:可以先跳 1 步,從下標 0 到達下標 1, 然后再從下標 1 跳 3 步到達最后一個下標。

算法分析

遍歷每一項,如果當前位置能到達并且大于前面所能到達的最大位置,就更新最大位置

代碼

class Solution:def canJump(self, nums: List[int]) -> bool:# 遍歷每一項max_i = 0for i,jump in enumerate(nums):# 如果當前位置能到達并且大于前面所能到達的最大位置,就更新最大位置if max_i>=i and i+jump>max_i:max_i = i+jumpreturn max_i>=len(nums)-1

45.跳躍游戲II

題目描述

給定一個長度為 n 的 0 索引整數數組 nums。初始位置為 nums[0]。
每個元素 nums[i] 表示從索引 i 向后跳轉的最大長度。換句話說,如果你在 nums[i] 處,你可以跳轉到任意 nums[i + j] 處:

? 0 <= j <= nums[i]?
? i + j < n
返回到達?nums[n - 1] 的最小跳躍次數。生成的測試用例可以到達 nums[n - 1]。

示例

輸入: nums = [2,3,1,1,4]
輸出: 2
解釋: 跳到最后一個位置的最小跳躍數是2,從下標為 0 跳到下標為 1 的位置,跳?1步,然后跳3步到達數組的最后一個位置。

算法分析

想象有一條河,0和m一1分別是河的兩岸。一開始,你在0,要到n-1。

把區間[i,i+nums[i]]視作一座橋。一開始只能建一座橋,也就是[0,nums[0]]。比如建造了一座從0到4的橋。

下一座橋要選哪個呢?

在可以選的橋中,選擇右端點最大的橋。它會讓你走的更遠。

重復該過程,到達n-1時退出循環。修建的橋的數量就是答案。

代碼

class Solution:def jump(self, nums: List[int]) -> int:ans = 0cur_right = 0  # 已建造的橋的右端點next_right = 0  # 下一座橋的右端點的最大值for i in range(len(nums) - 1):# 遍歷的過程中,記錄下一座橋的最遠點next_right = max(next_right, i + nums[i])if i == cur_right:  # 無路可走,必須建橋cur_right = next_right  # 建橋后,最遠可以到達 next_rightans += 1return ans

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

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

相關文章

為什么會出現redis數據庫?redis是什么?

什么是 Redis? 為什么要用 Redis? 下面我將從 Redis 出現的背景、Redis 的解決方案個來回答。 1、Redis 出現的背景 互聯網的應用越來越多&#xff0c;例如社交網絡、電商、實時服務發展的十分迅速&#xff0c;這就導致了傳統技術棧&#xff08;如關系型數據庫&#xff09;…

Windows 11下Git Bash執行cURL腳本400問題、CMD/PowerShell不能執行多行文本等問題記錄及解決方案

問題 在Postman里可成功執行的POST請求&#xff1a; 找到Postman的Code 因為cURL基本上算是行業標準&#xff0c;所以Postman默認選中cURL&#xff0c;支持切換不同的開發語言&#xff1a; 點擊上圖右上角的復制按鈕&#xff0c;得到cURL腳本。 Windows 11家庭版&#xff…

Docker基礎入門(一)

初識Docker 什么是Docker Docker是一個快速交付應用、運行應用的技術&#xff1a; 可以將程序及其依賴、運行環境一起打包為一個鏡像&#xff0c;可以遷移到任意Linux操作系統運行時利用沙箱機制形成隔離容器&#xff0c;各個應用互不干擾啟動、移除都可以通過一行命令完成&…

容器編排革命:從 Docker Run 到 Docker Compose 的進化之路20250309

容器編排革命&#xff1a;從 Docker Run 到 Docker Compose 的進化之路 一、容器化部署的范式轉變 在 Docker 生態系統的演進中&#xff0c;容器編排正從“手動操作”走向“自動化管理”。根據 Docker 官方 2023 年開發者調查報告&#xff0c;78% 的開發者已采用 Docker Compo…

c++ 嵌入匯編的方式實現int型自增

x86/x86_64 實現 x86 平臺上&#xff0c;使用 LOCK XADD 指令來實現原子自增&#xff1a; #include <iostream>inline int atomic_increment_x86(int* value) {int result;__asm__ __volatile__("lock xaddl %1, %0": "m"(*value), "r"(…

區塊鏈與去中心化技術

區塊鏈與去中心化技術 核心進展 區塊鏈從加密貨幣&#xff08;如比特幣&#xff09;擴展至智能合約和供應鏈管理。以太坊2.0引入分片技術提升交易吞吐量&#xff0c;而零知識證明&#xff08;ZKP&#xff09;增強了隱私保護15。企業級應用如IBM的Food Trust平臺通過區塊鏈追蹤…

逐夢DBA:Linux環境下 MySQL 的卸載

1. 查看是否安裝過MySQL&#xff0c;如果不存在&#xff0c;則不顯示任何內容 rpm -qa | grep -i mysql # -i 忽略大小寫 2. 查看MySQL服務狀態 systemctl status mysqld.service 3. 關閉 mysql 服務 systemctl stop mysqld.service 4. 查看當前 mysql 卸載狀況 rpm -qa…

【藍橋杯python研究生組備賽】003 貪心

題目1 股票買賣 給定一個長度為 N 的數組&#xff0c;數組中的第 i 個數字表示一個給定股票在第 i 天的價格。 設計一個算法來計算你所能獲取的最大利潤。你可以盡可能地完成更多的交易&#xff08;多次買賣一支股票&#xff09;。 注意&#xff1a;你不能同時參與多筆交易&…

網絡通信Socket中多態HandleIO設計模式深度解析

網絡通信 Socket 中多態 handleIO 詳細講解 大綱 引言 網絡通信的重要性Socket 編程在網絡通信中的地位多態 handleIO 的意義和作用 Socket 編程基礎 Socket 的基本概念Socket 的類型&#xff08;TCP 和 UDP&#xff09;Socket 編程的基本流程 多態的概念與實現 多態的定義和…

flutter 如何與原生框架通訊安卓 和 ios

在 Flutter 中與原生框架&#xff08;Android 和 iOS&#xff09;進行通信的主要方式是通過 **平臺通道&#xff08;Platform Channels&#xff09;**。平臺通道允許 Flutter 代碼與原生代碼進行雙向通信。以下是詳細的步驟和示例&#xff0c;說明如何在 Flutter 中與 Android …

LabVIEW VI Scripting實現連接器窗格自動化

通過VI Scripting自動化配置連接器窗格&#xff0c;可大幅提升開發效率、統一接口規范&#xff0c;并適配動態需求。以下為真實場景中的典型應用案例&#xff0c;涵蓋工業、汽車電子及教育領域&#xff0c;展示其實際價值與實施效果。 特點&#xff1a; 程序化配置&#xff1a;…

1-001:MySQL的存儲引擎有哪些?它們之間有什么區別?

MySQL 存儲引擎 ├── InnoDB&#xff08;默認引擎&#xff09; │ ├── 事務支持&#xff1a;支持 ACID 和事務&#xff08;事務日志、回滾、崩潰恢復&#xff09; │ ├── 鎖機制&#xff1a;支持行級鎖&#xff0c;提高并發性能 │ ├── 外鍵支持&#xff1a;支持外鍵…

package.json 依賴包約束及快速刪除node_modules

文章目錄 一、package.json版本約束1、初始項目安裝2. 已有 yarn.lock 文件的項目安裝3. 特殊情況手動修改 package.json 版本&#xff1a;使用 yarn upgrade 命令&#xff1a; 二、快速刪除node_modules三、depcheck 檢測npm未使用的依賴 一、package.json版本約束 1、初始項…

Redis Sentinel (哨兵模式)深度解析:構建高可用分布式緩存系統的核心機制

一、傳統主從復制的痛點 在分布式系統架構中&#xff0c;Redis 作為高性能緩存和數據存儲解決方案&#xff0c;其可用性直接關系到整個系統的穩定性。傳統的主從復制架構雖然實現了數據冗余&#xff0c;但在面臨節點故障時仍存在明顯缺陷&#xff1a; ?手動故障轉移&#xf…

[免費]微信小程序(圖書館)自習室座位預約管理系統(SpringBoot后端+Vue管理端)(高級版)【論文+源碼+SQL腳本】

大家好&#xff0c;我是java1234_小鋒老師&#xff0c;看到一個不錯的微信小程序(圖書館)自習室座位預約管理系統(SpringBoot后端Vue管理端)(高級版)&#xff0c;分享下哈。 項目視頻演示 【免費】微信小程序(圖書館)自習室座位預約管理系統(SpringBoot后端Vue管理端)(高級版…

微服務架構下的 Node.js

Node.js 在微服務架構中的特點 輕量級和高效性 Node.js 以其輕量級和高效的特點&#xff0c;非常適合構建微服務架構。它具有事件驅動和非阻塞 I/O 模型&#xff0c;能夠在處理高并發請求時表現出色。這意味著 Node.js 可以同時處理大量的并發連接&#xff0c;而不會因為阻塞…

Linux 配置靜態 IP

一、簡介 在 Linux CentOS 系統中默認動態分配 IP 地址&#xff0c;每次啟動虛擬機服務都是不一樣的 IP&#xff0c;因此要配置靜態 IP 地址避免每次都發生變化&#xff0c;下面將介紹配置靜態 IP 的詳細步驟。 首先先理解一下動態 IP 和靜態 IP 的概念&#xff1a; 動態 IP…

為什么 HTTP GET 方法不使用請求體?

本指南將揭示為什么 HTTP GET 方法不像其他 HTTP 方法那樣使用請求體&#xff0c;以及如何在 API 開發中有效地使用 GET 請求。 當談到 HTTP&#xff08;超文本傳輸協議&#xff09;時&#xff0c;您可能會好奇為什么 GET 方法通常不涉及請求體。在 Web 請求中&#xff0c;發送…

java后端--定時任務

定時任務 一、簡述二、注解1.Scheduled屬性&#xff1a; 2.EnableScheduling 三、案例 一、簡述 在java后端開發中&#xff0c;經常遇到一些任務需要頻繁發生&#xff0c;每次都人工調用太麻煩&#xff0c;這時就用到了定時任務進行自動化調用&#xff0c;大大便利了程序員的開…

JVM垃圾回收面試題及原理

1. 對象什么時候可以被垃圾器回收 如果一個或多個對象沒有任何的引用指向它了&#xff0c;那么這個對象現在就是垃圾&#xff0c;如果定位了垃圾&#xff0c;則有可能會被垃圾回收器回收 如果要定位什么是垃圾&#xff0c;有兩種方式來確定 引用計數法可達性分析算法 1.1 …