嘗試幾道算法題,提升python編程思維

一、跳躍游戲

題目描述
給定一個非負整數數組?nums,你最初位于數組的第一個下標。數組中的每個元素代表你在該位置可以跳躍的最大長度。判斷你是否能夠到達最后一個下標。

示例

  • 輸入:nums = [2,3,1,1,4]?→ 輸出:True
  • 輸入:nums = [3,2,1,0,4]?→ 輸出:False

---------------------------------------------------------------------------------------------------------------------------------

代碼實現

def can_jump(nums):max_reach = 0n = len(nums)for i in range(n):if i > max_reach:  # 當前位置無法到達,直接失敗return Falsemax_reach = max(max_reach, i + nums[i])if max_reach >= n - 1:  # 已覆蓋終點,提前成功return Truereturn max_reach >= n - 1  # 遍歷結束后判斷

詳細解析

  1. 核心變量max_reach?記錄當前能到達的最遠索引,初始為 0(起點)。
  2. 遍歷邏輯
    • 若當前索引?i?超過?max_reach,說明該位置不可達,直接返回?False(因為無法從前面的位置跳到這里)。
    • 計算從當前位置?i?能跳到的最遠距離?i + nums[i],并更新?max_reach?為兩者中的較大值(確保始終記錄最遠可達位置)。
    • 若?max_reach?已覆蓋數組最后一個索引(n-1),說明可到達終點,提前返回?True?以優化效率。
  3. 邊界處理:若遍歷完所有位置后?max_reach?仍未覆蓋終點,則返回?False(題目中大部分情況可提前判斷,此處為兜底)。
  4. 貪心思想體現:無需記錄具體路徑,只需通過局部最優(每次更新最遠可達距離)推導全局最優(是否能到終點),時間復雜度 O (n),空間復雜度 O (1)。

二、最長遞增子序列(動態規劃解法)

題目描述
給你一個整數數組?nums,找到其中最長嚴格遞增子序列的長度。子序列是由數組派生而來的序列,刪除(或不刪除)元素而不改變其余元素的順序,且子序列嚴格遞增。

示例
輸入:nums = [10,9,2,5,3,7,101,18]?→ 輸出:4(最長子序列為?[2,3,7,101]?或?[2,5,7,18]

---------------------------------------------------------------------------------------------------------------------------------

代碼實現

def length_of_lis(nums):if not nums:return 0n = len(nums)dp = [1] * n  # 每個元素至少自身是一個子序列for i in range(1, n):for j in range(i):if nums[j] < nums[i]:dp[i] = max(dp[i], dp[j] + 1)return max(dp)

詳細解析

  1. 動態規劃數組定義dp[i]?表示以?nums[i]?為結尾的最長嚴格遞增子序列的長度。初始值均為 1(每個元素自身構成長度為 1 的子序列)。
  2. 狀態轉移邏輯
    • 對于每個?i(從 1 到 n-1),遍歷所有?j < i
      • 若?nums[j] < nums[i],說明?nums[i]?可接在?nums[j]?后面形成更長的子序列,因此?dp[i]?可更新為?dp[j] + 1(與當前?dp[i]?取最大值,確保記錄最長長度)。
  3. 結果計算:遍歷完所有?i?后,dp?數組中的最大值即為整個數組的最長遞增子序列長度。
  4. 示例驗證:以?nums = [2,5,3,7]?為例:
    • i=0dp[0] = 1(初始值)。
    • i=1(nums[1]=5):j=0?時?nums[0]=2 < 5,故?dp[1] = dp[0]+1 = 2
    • i=2(nums[2]=3):j=0?時?nums[0]=2 < 3,故?dp[2] = dp[0]+1 = 2j=1?時?nums[1]=5 > 3,不更新)。
    • i=3(nums[3]=7):j=0?時?dp[0]+1=2j=1?時?dp[1]+1=3j=2?時?dp[2]+1=3,故?dp[3] = 3
      最終?max(dp) = 3(對應子序列?[2,5,7]?或?[2,3,7])。
  5. 復雜度:時間復雜度 O (n2)(兩層循環),空間復雜度 O (n)(存儲?dp?數組)。

三、最長遞增子序列(貪心 + 二分查找解法)

題目描述
同第二題(題目一致,解法不同)。

---------------------------------------------------------------------------------------------------------------------------------

代碼實現

import bisectdef length_of_lis(nums):tails = []for num in nums:# 找到tails中第一個 >= num的位置,替換它idx = bisect.bisect_left(tails, num)if idx == len(tails):tails.append(num)else:tails[idx] = numreturn len(tails)

詳細解析

  1. 核心思路:維護一個?tails?數組,其中?tails[i]?表示長度為?i+1?的嚴格遞增子序列的最小尾元素。例如:
    • tails[0]?是長度為 1 的子序列的最小尾元素(即數組中最小的元素)。
    • tails[1]?是長度為 2 的子序列的最小尾元素(即能接在?tails[0]?后面的最小元素)。
      這樣做的目的是:尾元素越小,后續越容易添加更大的元素形成更長的子序列(貪心策略)。
  2. 二分查找的作用
    • 對于每個新元素?num,用?bisect_left?在?tails?中查找第一個大于等于?num?的位置?idxtails?始終是嚴格遞增的,因此可二分)。
    • 若?idx?等于?tails?的長度,說明?num?比所有現有尾元素都大,可直接追加到?tails?末尾(此時子序列長度 + 1)。
    • 否則,將?tails[idx]?替換為?num(目的是用更小的尾元素更新該長度的子序列,為后續元素留更多可能)。
  3. 示例驗證
    輸入?nums = [10,9,2,5,3,7,101,18]
    • num=10?→?tails?為空,idx=0?等于長度 0,追加 →?tails = [10]
    • num=9?→ 二分找到?tails?中第一個 ≥9 的位置是 0(tails[0]=10),替換 →?tails = [9]
    • num=2?→ 二分找到位置 0,替換 →?tails = [2]
    • num=5?→ 二分找到位置 1(超過?tails?長度 1),追加 →?tails = [2,5]
    • num=3?→ 二分找到?tails?中第一個 ≥3 的位置是 1(tails[1]=5),替換 →?tails = [2,3]
    • num=7?→ 二分找到位置 2(超過長度 2),追加 →?tails = [2,3,7]
    • num=101?→ 二分找到位置 3(超過長度 3),追加 →?tails = [2,3,7,101]
    • num=18?→ 二分找到位置 3(tails[3]=101 ≥18),替換 →?tails = [2,3,7,18]
      最終?tails?長度為 4,即最長子序列長度為 4(與題目示例一致)。
  4. 關鍵說明tails?數組本身不是最長子序列,但其長度等于最長子序列的長度(因為每次更新都對應子序列長度的潛在增長)。
  5. 復雜度:時間復雜度 O (n log n)(每個元素二分查找 O (log k),k 是當前?tails?長度,總復雜度 O (n log n)),空間復雜度 O (n)(tails?最長為 n)。

四、島嶼數量(DFS 解法)

題目描述
給你一個由?'1'(陸地)和?'0'(水)組成的二維網格,請你計算網格中島嶼的數量。島嶼由相鄰的陸地連接形成,相鄰指水平或垂直方向(斜向不算)

示例
輸入:

grid = [["1","1","0","0","0"],["1","1","0","0","0"],["0","0","1","0","0"],["0","0","0","1","1"]
]

輸出:3

-------------------------------------------------------------------------------------

答案

def num_islands(grid):if not grid:return 0rows, cols = len(grid), len(grid[0])count = 0def dfs(i, j):# 越界或不是陸地,直接返回if i < 0 or i >= rows or j < 0 or j >= cols or grid[i][j] != '1':returngrid[i][j] = '0'  # 標記為已訪問(淹沒)# 遞歸遍歷四個方向(上下左右)dfs(i+1, j)  # 下dfs(i-1, j)  # 上dfs(i, j+1)  # 右dfs(i, j-1)  # 左for i in range(rows):for j in range(cols):if grid[i][j] == '1':count += 1  # 發現新島嶼dfs(i, j)  # 淹沒整個島嶼,避免重復計數return count

詳細解析

  1. 核心問題:統計 “連通分量” 的數量(相鄰陸地構成的獨立區域)。
  2. DFS 函數作用:從坐標?(i,j)?出發,遞歸 “淹沒” 所有相連的陸地(將?'1'?改為?'0'),確保每個島嶼只被計數一次。
  3. DFS 終止條件
    • 坐標越界(i?或?j?超出網格范圍)。
    • 當前位置不是陸地(grid[i][j] != '1',可能是水或已被淹沒的陸地)。
  4. 主循環邏輯
    • 遍歷網格中的每個單元格?(i,j)
    • 若遇到?grid[i][j] == '1',說明發現一個新島嶼,計數器?count?加 1。
    • 立即調用?dfs(i,j)?淹沒該島嶼(將所有相連的?'1'?改為?'0'),防止后續遍歷再次計數。
  5. 示例驗證
    以上述示例為例:
    • 首次遇到?(0,0)?為?'1'count=1,啟動 DFS 淹沒左上角所有相連的?'1'(第一、二行前兩列變為?'0')。
    • 繼續遍歷,遇到?(2,2)?為?'1'count=2,啟動 DFS 淹沒中間島嶼。
    • 最后遇到?(3,3)?為?'1'count=3,啟動 DFS 淹沒右下角島嶼((3,3)?和?(3,4)?相連)。
      最終?count=3,與示例一致。
  6. 復雜度:時間復雜度 O (rows×cols)(每個單元格最多被訪問一次),空間復雜度 O (rows×cols)(最壞情況全是陸地,遞歸棧深度為網格大小)。

?

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

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

相關文章

【菜狗處理臟數據】對很多個不同時間序列數據的文件聚類—20250722

目錄 具體做法 可視化方法1&#xff1a;PCA降維 可視化方法2、TSNE降維可視化&#xff08;非線性降維&#xff0c;更適合聚類&#xff09; 可視化方法3、輪廓系數評判好壞 每個文件有很多行列的信息&#xff0c;每列是一個駕駛相關的數據&#xff0c;需要對這些文件進行聚類…

Qwen-MT:翻得快,譯得巧

我們再向大家介紹一位新朋友&#xff1a;機器翻譯模型Qwen-MT。開發者朋友們可通過Qwen API&#xff08;qwen-mt-turbo&#xff09;&#xff0c;來直接體驗它又快又準的翻譯技能。 本次更新基于強大的 Qwen3 模型&#xff0c;進一步使用超大規模多語言和翻譯數據對模型進行訓練…

在 OceanBase 中,使用 TO_CHAR 函數 直接轉換日期格式,簡潔高效的解決方案

SQL語句SELECT TO_CHAR(TO_DATE(your_column, DD-MON-YY), YYYY-MM-DD) AS formatted_date FROM your_table;關鍵說明&#xff1a;核心函數&#xff1a;TO_DATE(30-三月-15, DD-MON-YY) → 將字符串轉為日期類型TO_CHAR(..., YYYY-MM-DD) → 格式化為 2015-03-30處理中文月份&a…

pnpm運行electronic項目報錯,npm運行正常。electronic項目打包為exe報錯

pnpm運行electronic項目報錯 使用 pnpm 運行 electronic 項目報錯&#xff0c;npm 運行正常&#xff0c;報錯內容如下 error during start dev server and electron app: Error: Electron uninstallat getElectronPath (file:///E:/project/xxx-vue/node_modules/.pnpm/elect…

8?? 高級特性—— 列表生成式

文章目錄&#x1f9e0; 總結1. 基本語法2. 加篩選條件&#x1f501; 雙層循環&#xff08;全排列&#xff09;&#x1f4c2; 遍歷目錄&#x1f511; 遍歷字典&#x1f521; 轉小寫3. if 和 if...else 的區別4. 練習題&#x1f9e0; 總結 特性用法示例基礎語法[x for x in iter…

DocC的簡單使用

DocC的簡單使用 在寫3GShare中&#xff0c;由于剛開始使用MVC模式來寫東西&#xff0c;對很多東西都不是很熟&#xff0c;經常寫著寫著就忘了自己在寫什么&#xff0c;所以學了一下DocC來加快開發進度 什么是DocC 簡單來說&#xff0c;DocC就是更高級的注釋&#xff0c;雖然…

深入理解C語言快速排序與自省排序(Introsort)

排序算法是計算機科學中最基礎也是最重要的知識之一。快速排序&#xff08;Quicksort&#xff09;因其平均時間復雜度為 O(n log n) 而廣受歡迎&#xff0c;但在最壞情況下會退化到 O(n)。為了克服這一缺點&#xff0c;自省排序&#xff08;Introsort&#xff09; 應運而生&…

C#編程基礎:運算符與結構詳解

目錄 一.關系運算符 常見關系運算符 二.邏輯運算符 常見邏輯運算符 1. 邏輯與&#xff08;&& 或 and&#xff09; 2. 邏輯或&#xff08;|| 或 or&#xff09; 3. 邏輯非&#xff08;! 或 not&#xff09; 運算符優先級 三.if語句 1.c#程序的三大結構 1.順序…

嵌入式學習-土堆目標檢測(3)-day27

再學一個labelme在labelstudio環境中再pip install labelme安裝好后直接輸入 labelme之后點擊保存&#xff0c;選擇保存文件地址還有一個就是將labelme的格式轉化為yolo格式還是在labelstudio這個環境里面安裝pip install labelme2yolo

Qt OpenGL 集成:開發 3D 圖形應用

Qt 提供了完善的 OpenGL 集成方案&#xff0c;使開發者能夠在 Qt 應用中高效開發 3D 圖形應用。通過 Qt 的 OpenGL 模塊&#xff0c;可簡化 OpenGL 上下文管理、窗口渲染和跨平臺適配&#xff0c;同時結合現代 OpenGL 特性&#xff08;如著色器、頂點緩沖、紋理等&#xff09;實…

【NLP輿情分析】基于python微博輿情分析可視化系統(flask+pandas+echarts) 視頻教程 - 熱詞評論查詢功能實現

大家好&#xff0c;我是java1234_小鋒老師&#xff0c;最近寫了一套【NLP輿情分析】基于python微博輿情分析可視化系統(flaskpandasecharts)視頻教程&#xff0c;持續更新中&#xff0c;計劃月底更新完&#xff0c;感謝支持。今天講解熱詞評論查詢功能實現 視頻在線地址&#…

使用 Google Earth 的 DEM — 教程。

數字高程模型 (DEM)描繪了已知高程點之間的表面高程。本教程將向您展示如何使用 Google Earth 的高程數據生成 DEM。在當今世界&#xff0c;DEM 主要用于 GIS 應用。 當然&#xff0c;我們可以從美國地質調查局 (USGS) 網站下載數字高程模型 (DEM)。但如果我們想知道某個地點的…

在 UniApp 中實現中間凸起 TabBar 的完整指南

如何在 UniApp 中設置中間 TabBar 凸起效果 在移動應用開發中&#xff0c;TabBar 是常見的導航組件&#xff0c;而中間凸起的 TabBar 按鈕則是一種流行的設計風格&#xff0c;常用于突出重要功能&#xff08;如發布、拍照等&#xff09;。UniApp 提供了 midButton 屬性&#xf…

微觀低代碼

今日去深圳的一家工廠給客戶做培訓&#xff0c;主要培訓內容為低代碼產品的二開和功能演示。客戶使用了20年的ERP和OA系統&#xff0c;目前想對接到低代碼平臺。客戶目前想實現的主要功能是&#xff0c;對接OA的單點登錄&#xff0c;把ERP的功能遷移到低代碼平臺上來工廠規模比…

Linux進程控制:掌握系統的核心脈絡

Linux進程控制&#xff1a;掌握系統的核心脈絡 在 Linux 系統中&#xff0c;進程控制是系統運行的核心機制之一。無論是日常的命令行操作&#xff0c;還是復雜的后臺服務運行&#xff0c;都離不開對進程的管理和控制。本文將深入探討 Linux 進程控制的相關知識&#xff0c;幫助…

4N90-ASEMI電機控制專用4N90

編輯&#xff1a;LL4N90-ASEMI電機控制專用4N90型號&#xff1a;4N90品牌&#xff1a;ASEMI封裝&#xff1a;ITO-220ABRDS(on):3.60Ω批號&#xff1a;最新引腳數量&#xff1a;3封裝尺寸&#xff1a;如圖特性&#xff1a;N溝道MOS管工作結溫&#xff1a;-55℃~150℃一、卓越性…

Java 筆記 lambda

?Lambda 基本語法 (parameters) -> expression 或 (parameters) -> { statements }// 無參數 Runnable r () -> System.out.println("Hello");// 單個參數&#xff08;小括號可省略&#xff09; Consumer<String> c s -> System.out.println(s…

安全風險監測平臺:被動應對向主動預防的轉變

一、智能識別預警系統安全風險監測平臺通過部署多維度感知網絡&#xff0c;實現對各類安全隱患的智能識別與實時預警。系統采用深度學習算法&#xff0c;對人員行為、設備狀態、環境參數等進行全天候監測分析&#xff0c;建立動態風險評估模型。當檢測到異常情況時&#xff0c;…

圖片查重從設計到實現(2)Milvus安裝準備etcd介紹、應用場景及Docker安裝配置

etcd作用、應用場景及Docker安裝配置 在分布式向量數據庫 Milvus 的架構中&#xff0c;etcd 扮演著至關重要的角色。Milvus 用于存儲和管理海量向量數據&#xff0c;支持高效的相似性搜索等操作&#xff0c;而其分布式集群的正常運行高度依賴元數據的一致性和可靠性&#xff0c…

零彈窗干擾的貪吃蛇游戲,下載即玩

軟件介紹 在尋找貪吃蛇游戲的過程中&#xff0c;我發現了一款PC端版本&#xff0c;無需登錄即可直接使用&#xff0c;完全符合我的需求。 使用優勢 這款軟件最大的亮點在于完全免費&#xff0c;沒有任何廣告和彈窗干擾&#xff0c;支持完全離線運行&#xff0c;讓用戶能夠專注…