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

題目

難度:★★★☆☆
類型:數(shù)組
方法:動態(tài)規(guī)劃

力扣鏈接請移步本題傳送門
更多力扣中等題的解決方案請移步力扣中等題目錄

給定一個未排序的整數(shù)數(shù)組党饮,找到最長遞增子序列的個數(shù)憎兽。

示例 1:

輸入: [1,3,5,4,7]
輸出: 2
解釋: 有兩個最長遞增子序列蛔琅,分別是 [1, 3, 4, 7] 和[1, 3, 5, 7]。

示例 2:

輸入: [2,2,2,2,2]
輸出: 5
解釋: 最長遞增子序列的長度是1窘哈,并且存在5個子序列的長度為1,因此輸出5家夺。
注意: 給定的數(shù)組長度不超過 2000 并且結(jié)果一定是32位有符號整數(shù)疤坝。

解答

最長遞增子序列的問題常常使用動態(tài)規(guī)劃來解決∨悖回顧一下如何求最長遞增子序列的長度的問題亲雪。我們準備一個長度為len(nums)的數(shù)組length,其中l(wèi)ength[i]表示以nums[i]為結(jié)尾元素的最長遞增子序列的長度疚膊,初始狀態(tài)填充為1义辕。

需要進行兩次遍歷,外層循環(huán)的下標i從0到len(nums)寓盗,內(nèi)層循環(huán)的下標j從0到i灌砖,這里也就保證了j<i璧函,每當遇到nums[j]<nums[i]時,說明以nums[j]結(jié)尾的遞增子序列(任意一個)有條件將nums[i]吸納進去基显,并壯大自己的力量蘸吓,使本遞增子序列的長度增加1,用代碼來表示也就是length[i] = max(length[i],length[j]+1)撩幽,表達的含義就是以nums[i]結(jié)尾的最長子序列的長度在以nums[j]結(jié)尾的最長子序列的長度的基礎(chǔ)上增加nums[i]這個元素库继。

如果需要統(tǒng)計個數(shù),我們準備一個新的數(shù)組count窜醉,并初始化為1宪萄,用來記錄以nums[i]結(jié)尾的最長上升子序列的個數(shù),例如上面描述的每當遇到nums[j]<nums[i]榨惰,更新長度向量的同時還要更新count向量拜英,由于nums[i]相當于以nums[j]結(jié)尾的最長序列的一個向外擴展,因此直接繼承nums[j]結(jié)尾的最長子序列的個數(shù)即可读串,也就是count[i]=count[j]聊记。

但是,只有繼承是遠遠不夠的恢暖,在合適的時候還需要進行更新。這里需要說明一下的是狰右,lenght向量中任意一個位置杰捂,是有可能被更新多次的,如果length[i]處已經(jīng)有值棋蚌,它被覆蓋的條件是有更大的值的出現(xiàn)嫁佳。如果我們得到的length[j]+1正好和這個位置處的值lenght[i]相等說明什么呢?說明的是以nums[i]結(jié)尾的最長上升子序列在本次更新之前已經(jīng)出現(xiàn)過了谷暮,出現(xiàn)的次數(shù)存在count[i]位置處蒿往,為了表達這種出現(xiàn)的重復(fù),我們將以nums[j]結(jié)尾的最長上升子序列的出現(xiàn)次數(shù)和上一次的出現(xiàn)次數(shù)累加湿弦,并更新到count[i]位置就好了瓤漏,這是這道題的難點。

最終返回的是出現(xiàn)長度最長的子序列出現(xiàn)的次數(shù)颊埃,如果python不熟可以查一下資料理解代碼蔬充。

class Solution(object):
    def findNumberOfLIS(self, nums):
        N = len(nums)
        if N <= 1:
            return N
        length = [1] * N
        count = [1] * N

        for i, num in enumerate(nums):
            for j in range(i):
                if nums[j] < nums[i]:
                    if length[j] >= length[i]:
                        length[i] = max(length[i], 1 + length[j])
                        count[i] = count[j]
                    elif length[j] + 1 == length[i]:
                        count[i] += count[j]

        longest = max(length)
        return sum(c for i, c in enumerate(count) if length[i] == longest)

如有疑問或建議,歡迎評論區(qū)留言~

有關(guān)更多力扣中等題的python解決方案班利,請移步力扣中等題解析

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末饥漫,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子罗标,更是在濱河造成了極大的恐慌庸队,老刑警劉巖积蜻,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異彻消,居然都是意外死亡竿拆,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門证膨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來如输,“玉大人,你說我怎么就攤上這事央勒〔患” “怎么了?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵崔步,是天一觀的道長稳吮。 經(jīng)常有香客問我,道長井濒,這世上最難降的妖魔是什么灶似? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮瑞你,結(jié)果婚禮上酪惭,老公的妹妹穿的比我還像新娘。我一直安慰自己者甲,他們只是感情好春感,可當我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著虏缸,像睡著了一般鲫懒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上刽辙,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天窥岩,我揣著相機與錄音,去河邊找鬼宰缤。 笑死颂翼,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的撵溃。 我是一名探鬼主播疚鲤,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼缘挑!你這毒婦竟也來了集歇?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤语淘,失蹤者是張志新(化名)和其女友劉穎诲宇,沒想到半個月后际歼,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡姑蓝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年鹅心,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纺荧。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡旭愧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出宙暇,到底是詐尸還是另有隱情输枯,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布占贫,位于F島的核電站桃熄,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏型奥。R本人自食惡果不足惜瞳收,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望厢汹。 院中可真熱鬧螟深,春花似錦、人聲如沸烫葬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽厘灼。三九已至,卻和暖如春咽瓷,著一層夾襖步出監(jiān)牢的瞬間设凹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工茅姜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留闪朱,地道東北人。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓钻洒,卻偏偏與公主長得像奋姿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子素标,可洞房花燭夜當晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容