国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Python中最長的遞增序列

這篇具有很好參考價值的文章主要介紹了Python中最長的遞增序列。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

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

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

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

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

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

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

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

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

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

然后,從這一點開始,遞歸地繼續(xù)下去??纯聪旅娴睦?,哪條路徑最長,會是指數(shù)級的;我們很容易想到必須要有一些動態(tài)編程的方法。

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

[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,...]

時間復雜度和空間復雜度

讓我們跳入代碼,創(chuàng)建我們的類,稱為CalculateSubSequence ;在lengthOfLIS 函數(shù)里面,我們初始化我們的nums_list 變量為nums 的長度,這個數(shù)組將只有1次。

在嵌套循環(huán)里面,我們將檢查該值是否大于我們要檢查的數(shù)字。然后,讓我們把我們的nums_list 的i ,我們將更新nums_list 的值,同時使用最大值 nums_list[i].

i 在外循環(huán)的迭代之后,對于 nums_list[j],j 是在內(nèi)循環(huán)迭代后產(chǎn)生的,然后我們將其添加到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

上面的解決方案已經(jīng)足夠了,但是另一種方法,n log ,使用二進制搜索到我們的臨時數(shù)組的左邊,使用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])

輸出:文章來源地址http://www.zghlxwxcb.cn/news/detail-712138.html

4

到了這里,關于Python中最長的遞增序列的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 算法刷題Day 52 最長遞增子序列+最長連續(xù)遞增子序列+最長重復子數(shù)組

    我自己想出來的方法,時間復雜度應該是 O(n2) 滑動窗口 連續(xù)的話,可以考慮用滑動窗口 動態(tài)規(guī)劃 貪心算法

    2024年02月14日
    瀏覽(50)
  • LeetCode | C++ 動態(tài)規(guī)劃——300.最長遞增子序列、674. 最長連續(xù)遞增序列、718. 最長重復子數(shù)組

    300題目鏈接 dp 數(shù)組定義 dp[i] 表示 i 之前包括 i 的以 nums[i]結(jié)尾 的最長遞增子序列的長度 需要包含nums[i]結(jié)尾,不然在做遞增比較的時候,就沒有意義了。 遞推公式 位置 i 的最長遞增子序列 等于 j 從 0 到 i - 1各個位置的最長遞增子序列 + 1 的 最大值 if (nums[i] nums[j]) dp[i] = ma

    2024年02月16日
    瀏覽(49)
  • 力扣300. 最長遞增子序列

    思路: 假設 dp[i] 為前 i 個元素構成的最長遞增子序列的個數(shù),包含 nums[i]; 則 dp[i] 構成序列上一個元素 nums[j] 構成最長遞增子序列 dp[j],則 dp[i] = dp[j] + 1; 如果動態(tài)取 j ∈ [0, i - 1],則選取其中最長遞增子序列值中最大的,其值 + 1 來更新 dp[i] 的值;

    2024年02月04日
    瀏覽(24)
  • 57 最長遞增子序列

    57 最長遞增子序列

    給你一個整數(shù)數(shù)組 nums ,找到其中 最長嚴格遞增子序列的長度 。 子序列 是由數(shù)組派生而來的序列,刪除(或不刪除)數(shù)組中的元素而不改變其余元素的順序。例如,[3,6,2,7] 是數(shù)組 [0,3,1,6,2,2,7] 的子序列。 示例 1: 輸入: nums = [10,9,2,5,3,7,101,18] 輸出:4 解釋:最長遞增子序列

    2024年02月07日
    瀏覽(25)
  • 最長遞增子序列——力扣300

    最長遞增子序列——力扣300

    2024年02月12日
    瀏覽(25)
  • 300. 最長遞增子序列

    給你一個整數(shù)數(shù)組 nums ,找到其中最長嚴格遞增子序列的長度。 子序列 是由數(shù)組派生而來的序列,刪除(或不刪除)數(shù)組中的元素而不改變其余元素的順序。例如, [3,6,2,7] 是數(shù)組 [0,3,1,6,2,2,7] 的子序列。 示例 1: 示例 2: 示例 3: 提示: 1 = nums.length = 2500 -104 = nums[i] = 104

    2024年02月09日
    瀏覽(22)
  • 動態(tài)規(guī)劃之最長遞增子序列

    leetcode 300 最長遞增子序列 1.定義dp數(shù)組:dp[i]表示以nums[i]結(jié)尾的最長遞增子序列的長度。 2.定義遞推公式 dp[i] = max(dp[j] + 1, dp[i]) 因為dp[j] + 1中的dp[j]并非是在前一個已經(jīng)加1的dp[j]的基礎之上再加上1。若從初始狀態(tài)加1,而dp[i]永遠保持的是最大的狀態(tài),則dp[j] + 1肯定要小一些。

    2024年01月23日
    瀏覽(40)
  • 673. 最長遞增子序列的個數(shù)

    673. 最長遞增子序列的個數(shù)

    673. 最長遞增子序列的個數(shù) https://leetcode.cn/problems/number-of-longest-increasing-subsequence/description/

    2024年02月11日
    瀏覽(22)
  • 【Leecode】674. 最長連續(xù)遞增序列

    【Leecode】674. 最長連續(xù)遞增序列

    Given an unsorted array of integers nums , return the length of the longest continuous increasing subsequence (i.e. subarray). The subsequence must be strictly increasing. A continuous increasing subsequence is defined by two indices l and r (l r) such that it is [nums[l], nums[l + 1], ..., nums[r - 1], nums[r]] and for each l = i r , nums[i] nums[i + 1] . E

    2024年02月07日
    瀏覽(25)
  • 動態(tài)規(guī)劃算法 | 最長遞增子序列

    動態(tài)規(guī)劃算法 | 最長遞增子序列

    通過查閱相關資料 發(fā)現(xiàn)動態(tài)規(guī)劃問題一般就是求解最值問題 。這種方法在解決一些問題時應用比較多,比如求最長遞增子序列等。 有部分人認為動態(tài)規(guī)劃的核心就是:窮舉。因為要求最值,肯定要把所有可行的答案窮舉出來,然后在其中找最值。 首先,筆者認為動態(tài)規(guī)劃中

    2024年02月06日
    瀏覽(31)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包