Python中最長的遞增序列

来源:https://www.cnblogs.com/xxpythonxx/archive/2023/09/20/17717656.html
-Advertisement-
Play Games

Python庫解析地址PyParsing 人們普遍認為,Python編程語言的pyparsing 模塊是對文本數據進行操作的一個寶貴工具。 用於解析和修改文本數據的pyparsing 包,簡化了對地址的操作。這是因為該模塊可以轉換和幫助解析地址。 在這篇文章中,我們將討論PyParsing 模塊在處 ...


如何使用Python中的N平方法和二進位搜索法計算一個數組中最長的遞增子序列。

使用N平方法計算最長的遞增子序列

在Python社區中,有一個著名的問題是關於最長遞增子序列的,在不同的面試中也會被問到。這是一個Leetcode ,問題說:給定一個未排序的整數數組,找出該數組的最長遞增子序列或子集的長度。

一個子集就像一個數組的短數組;每個數組可以有多個子集。另一件事是子數組將是這個[10,9,2,5,3,7,101,18] 數組中的一些元素,但以連續的子序列方式。

它可以像[2, 3, 5, 7] ,但不能像[2,3,101] ,所以在討論子數組時不需要打破順序。而且,在子序列中,元素在數組中出現的順序必須是相同的,但可以是任何一個個體。

例如,在這種情況下,我們可以看到,答案是[2, 3, 7,101] ;5 ,但這是可以的,因為它是一個子序列。

如果我們看到從[10,9,2,5,3,7,101,18] 開始的最長的遞增子序列,我們會發現[2, 5, 7, 101] ;這也可能意味著一個答案,但答案也可能是[2, 3, 7, 101] ,這也是我們的另一個子序列。[3, 7, 101] 也是一個子序列,但這不是最長的,所以我們不考慮它。

可能有不止一個組合;正如我們剛剛看到的,我們只需要返回長度。

通過這個例子,我們可以很容易地想到一個遞歸的解決方案,從零索引開始,沿著所有不同的路徑進行。使用這個數組[0,3,1,6,2,2,7] ,我們可以採取,例如,用0 ,我們可以轉到3 ,或者我們可以轉到1 ,或者轉到6 。

然後,從這一點開始,遞歸地繼續下去。看看下麵的例子,哪條路徑最長,會是指數級的;我們很容易想到必須要有一些動態編程的方法。

所以,我們有一個數組,每個索引至少有一個長度。

[0,3,1,6,2,2,7]
[1,1,1,1,1,1,1]

我們將從第一個索引開始,0 ,其長度是1 ,但有了3 ,我們可以看後面,如果3 大於0 ,那麼3 有2 的長度。如果我們再以1 ,我們將在當前索引之前的所有索引後面尋找。

從零索引中,我們可以看到1 大於0 ,但1 不大於3 ,所以在這一點上,我們要計算0 和1 ,其長度將是2 。

[0,3,1,6,2,2,7]
[1,2,2,1,1,1,1]

在考慮6 ,讓我們從後面開始看,我們知道6 大於[0,1] 或[0,3] ,包括6 ,其長度將是3 ,然後也是2 的長度是3 ,以此類推,這是一個平方的方法。

[0,3,1,6,2,2,7]
[1,2,2,3,3,...]

時間複雜度和空間複雜度

讓我們跳入代碼,創建我們的類,稱為CalculateSubSequence ;在lengthOfLIS 函數裡面,我們初始化我們的nums_list 變數為nums 的長度,這個數組將只有1次。

在嵌套迴圈裡面,我們將檢查該值是否大於我們要檢查的數字。然後,讓我們把我們的nums_list 的i ,我們將更新nums_list 的值,同時使用最大值 nums_list[i].

i 在外迴圈的迭代之後,對於 nums_list[j],j 是在內迴圈迭代後產生的,然後我們將其添加到1 中。最後,我們將返回nums_list 的最大值。

class CalculateSubSequence:
    def lengthOfLIS(self, nums: list[int]) -> int:
        nums_list = [1] * len(nums)
        for i in range(len(nums)-1, -1, -1):
            for j in range(i+1, len(nums)):
                if nums[i] < nums[j]:
                    nums_list[i] = max(nums_list[i], nums_list[j] + 1)
        return max(nums_list)
sbs = CalculateSubSequence()
sbs.lengthOfLIS([0,3,1,6,2,2,7])

這裡的時間複雜度將是n 的平方,而空間複雜度將是o 的n 。

4

上面的解決方案已經足夠了,但是另一種方法,n log ,使用二進位搜索到我們的臨時數組的左邊,使用bisect_left 。

from bisect import bisect_left
#Python小白學習交流群:153708845
class CalculateSubSequence:
    def lengthOfLIS(self, nums: list[int]) -> int:
        n= len(nums)
        tmp=[nums[0]]
        for n in nums:
            x = bisect_left(tmp,n)
            if x ==len(tmp):
                tmp.append(n)
            elif tmp[x]>n:
                tmp[x]=n
        return len(tmp)
sbs = CalculateSubSequence()
sbs.lengthOfLIS([0,3,1,6,2,2,7])

輸出:

4

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 工作中經常遇到按照指定格式的時間進行展示。可參考以下腳本邏輯滿足需求 Date.prototype.PtTimeByFormat = function (fmt){ var o = { "M+": this.getMonth() + 1, //月份 "d+": this.getDate(), //日 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 前言 可選鏈運算符(?.),大家都很熟悉了,直接看個例子: const result = obj?.a?.b?.c?.d 很簡單例子,上面代碼?前面的屬性如果是空值(null或undefined),則result值是undefined,反 ...
  • import React, { useEffect, useState } from 'react'; hook 是react 16.8的新增特性 ,他可以讓你不在編寫class的情況下shiystate以及react的特性 Hooks的出現,首先解決了以下問題: 告別了令人疑惑的生命周期 告別類組 ...
  • 設計模式 學習推薦設計模式目錄:22種設計模式 (refactoringguru.cn) 圖說設計模式 — Graphic Design Patterns (design-patterns.readthedocs.io) UML類圖初見 什麼是統一建模語言(UML)? (visual-paradig ...
  • 一、前言 這篇博客是對軟體工程導論的個人項目進行互評,項目要求實現一個簡單的中小學數學卷子自動生成程式。我的搭檔謝先衍同學使用Python完成了項目,而我則是使用java。儘管語言不同增加了一定的閱讀成本,但是接觸到另一種新語言並體會編程者發揮語言特性獨特的心得,確實是拓展了眼界。一個項目,最終歸結 ...
  • KMP演算法是一種高效的字元串匹配演算法,它的核心思想是利用已經匹配成功的子串首碼的信息,避免重覆匹配,從而達到提高匹配效率的目的。KMP演算法的核心是構建模式串的首碼數組Next,Next數組的意義是:當模式串中的某個字元與主串中的某個字元失配時,Next數組記錄了模式串中應該回退到哪個位置,以便繼續匹... ...
  • 上一篇提到過類的屬性,但沒有詳細介紹,本篇詳細介紹一下類的屬性 一 、類的屬性 方法是用來操作數據的,而屬性則是建模必不的內容,而且操作的數據,大多數是屬性,比如游戲中的某個boss類,它的生命值就是屬性(不同級別的boss,有不同的生命值),被攻擊方法(不同的攻擊,傷害值不同),當boss被攻擊時 ...
  • 大家好,我是Antvictor,一個勵志要成為架構師的程式員。 閑話少說,讓我們直接開始安裝Python。 Python安裝 從Python官網找到Download下載對應的安裝包,python3.6及以上即可。 Python官網會根據系統預設展示對應系統的最新版本安裝包,下載成功後點擊安裝。 這裡 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...