leetcode 300最長上公升子串行

2022-08-14 05:54:11 字數 2536 閱讀 9150

給定乙個無序的整數陣列,找到其中最長上公升子串行的長度。

示例:輸入: [10,9,2,5,3,7,101,18]

輸出: 4

解釋: 最長的上公升子串行是 [2,3,7,101],它的長度是 4。

說明:

可能會有多種最長上公升子串行的組合,你只需要輸出對應的長度即可。

你演算法的時間複雜度應該為 o(n2) 。

高階: 你能將演算法的時間複雜度降低到 o(n log n) 嗎?

想暴力搜尋解決,基本思路為有乙個陣列dp[i]儲存以i開始的最長上公升子串行長度。兩層for迴圈,外層遍歷陣列,內層找到以i開始i之後的最大長度,如果後面的元素更大長度就加1.結果發現對於2534著種情況,只統計25,之後34都比5小就不放了。真正長度應為234把5跳過,所以我暴力搜尋的想法的問題在於沒有對跳過元素的考慮。要想全不情況考慮的話應該是n個數任意取n個數、n-1個數、……1個數的所有情況都考慮,但是這樣時間複雜度過大.n-1 + nn-1 + nn-1*n-2+……

錯誤**如下:

int

lengthoflis

(vector

&nums

)vectordp(

len,

1);int

max_len =1

;for

(inti =

0;i <

len;

i++)

}

max_len

=max_len

>dp[

i]?max_len:dp

[i];

}

// 獲取了所有長度

return

max_len

;}

反思:對於暴力搜尋一定要把所有的情況都考慮到,不要想當然,要針對自己的思路設計好測試用例,看是否使用所有情況,如果複雜度過高,則要使用高階的演算法去解決。

思路:狀態dp[i]是以第i個元素結尾的最長子序列長度,狀態轉移方程為dp[i] = max(dp[j])+1;j滿足num[i] > nums[j]且jclass

solution

vectordp(

len,

0);dp[0

]=1;

int

max_len =1

;for

(inti =

1;i <

len;

i++)

}

max_len

=max_len

>dp[

i]?max_len:dp

[i];

}

// 獲取了所有長度

return

max_len

;}

};

2.1時間複雜度為n方,其關鍵在於第二層遍歷要找到最大的dp要遍歷i-1個元素

演算法思想:維持乙個當前最長子序列,我們從前向後遍歷肯定希望後面的元素看是否可以填到當前最長子序列中。每遍歷乙個元素,如果比當前最長子序列最後乙個元素大,最長子序列增長。如果比當前最長子序列小,(重點內容)我們希望當前最長子序列的最後乙個數盡可能的小,這樣可以放入更多的數。所以把這個無法放在末尾的數使用替換的方式放進最長子串行使其在上限減小。這樣改變長度又縮短了大小。

2534來說

一開始,當前序列2

然後,5>2,當前序列2,5

然後,3<5,放不進去但我們希望上限更小2,3。在個數不變情況下3換5這樣上限變小 然後,4>3,當前序列2,3,4

個人感覺是利用了放不進去的情況,用替換的方法構造最優子結構,以簡化之後的遍歷操作.

以4 10 4 來說

一開始,序列4

然後, 4 10

然後,第二個4<10,放不進去。我們替換變成4 10 注不是4 4 因為4 4 不是嚴格上公升序列

綜上在放不進去的情況下就是找序列中第乙個大於等於nums【i】的元素dp[j]替換調

classsolution

vector

dp;dp.push_back(nums[

0]);

for(int i =1; i < len; i++)

else

else

}dp[pos]=nums[i];}//

獲取了所有長度

return

dp.size();

}};

截圖:

總結:動態規劃將問題由大化小,貪心設計最優子結構給予二分查詢的使用條件。

LeetCode300 最長上公升子串行

給定乙個無序的整數陣列,找到其中最長上公升子串行的長度。示例 輸入 10,9,2,5,3,7,101,18 輸出 4解釋 最長的上公升子串行是 2,3,7,101 它的長度是4。說明 題目分析 方法一 動態規劃,用dp i 表示以nums i 結尾的最長上公升子串行。那麼如何求dp i 呢,只要看n...

Leetcode 300 最長上公升子串行

給定乙個無序的整數陣列,找到其中最長上公升子串行的長度。示例 輸入 10,9,2,5,3,7,101,18 輸出 4解釋 最長的上公升子串行是 2,3,7,101 它的長度是4。說明 高階 你能將演算法的時間複雜度降低到 o n log n 嗎?解題思路 1.普通演算法 動態規劃。假設陣列的前n個數...

leetcode 300 最長上公升子串行

給定乙個無序的整數陣列,找到其中最長上公升子串行的長度。示例 輸入 10,9,2,5,3,7,101,18 輸出 4解釋 最長的上公升子串行是 2,3,7,101 它的長度是4。說明 高階 你能將演算法的時間複雜度降低到 o n log n 嗎?解法1 動態規劃空間複雜度o n 時間複雜度o n 2...