俄羅斯套娃信封問題(排序 動態規劃) 二分 貪心

2021-10-21 00:21:40 字數 2491 閱讀 2588

給定一些標記了寬度和高度的信封,寬度和高度以整數對形式 (w, h) 出現。當另乙個信封的寬度和高度都比這個信封大的時候,這個信封就可以放進另乙個信封裡,如同俄羅斯套娃一樣。

請計算最多能有多少個信封能組成一組「俄羅斯套娃」信封(即可以把乙個信封放到另乙個信封裡面)。

說明:不允許旋轉信封。

輸入: envelopes = [[5,4],[6,4],[6,7],[2,3]]

輸出: 3

解釋: 最多信封的個數為 3, 組合為: [2,3] => [5,4] => [6,7]。

要找一條最長子序列 [w1,h1],[w2,h2]…[wn,hm] 同時要滿足 w和h都是遞增不等序列。

滿足w1f[i

]=

max⁡j=

0...if

[j]+

1f[i] =\max_

f[i]=j

=0..

.imax​f[

j]+1

m ax

val=

max⁡i=

0...nf

[i

]maxval =\max_

maxval

=i=0

...n

max​f[

i]時間複雜度:o(n

2n^2

n2).排序序需要的時間複雜度為 o(nlog n),動態規劃需要的時間複雜度為 o(n

2n^2

n2),前者忽略;

空間複雜度:o(n),即為陣列 f 需要的空間。

class

solution

else}}

);//按寬度排序,寬度一樣時

int maxval =

1,n = envelopes.length;

int[

] f =

newint

[n];

arrays.

fill

(f,1);

int i =

1, j =0;

for(

; i < n;

++i)

}

maxval = math.

max(f[i]

, maxval);}

return maxval;

}}

##解法二 、二分動態規劃(二分dp)(貪心演算法、二分查詢)

很明顯:f[i

]=

max⁡j=

0...if

[j]+

1f[i] =\max_

f[i]=j

=0..

.imax​f[

j]+1

這個動態規劃方程的時間是o(n

2n^2

n2),耗費了大量時間。這裡是找h的最長遞增子串行。

用二分法+貪心演算法找最長遞增子串行:

在乙個嚴格的遞增子串行f,

1.遍歷序列

1.1當遇到大於 f 最後乙個數字的 i 時,直接新增 i 到 f 最後

1.2當遇到小於 f 最後乙個數字時,這時候 i 是乙個可以考慮的數字,把它替換到 f 中它應該出現的位置。

1.2.1如果 i 出現的位置不是最後乙個位置,那代表著以 i 為結尾的序列不是最長。

1.2.2反之,是最長(並且淘汰了之前最後值,因為不論後面的值如何,一定是大於 i 的 ,之前最後值大於i)。

最後遍歷完 f.size() 就是最長序列;

時間複雜度為o(nlogn)

public

intlengthoflis

(int

nums)

else

}return f.

size()

;}public

intbinarysearch

(list

f,int target)

else

}return low;

}

class

solution

int n = envelopes.length;

arrays.

sort

(envelopes,

newcomparator

<

int[

]>()

else}}

);list

f =newarraylist

(); f.

add(envelopes[0]

[1])

;for

(int i =

1; i < n;

++i)

else

}return f.

size()

;}public

intbinarysearch

(list

f,int target)

else

}return low;

}}

俄羅斯套娃信封問題

給定一些標記了寬度和高度的信封,寬度和高度以整數對形式 w,h 出現。當另乙個信封的寬度和高度都比這個信封大的時候,這個信封就可以放進另乙個信封裡,如同俄羅斯套娃一樣。請計算最多能有多少個信封能組成一組 俄羅斯套娃 信封 即可以把乙個信封放到另乙個信封裡面 說明 不允許旋轉信封。示例 輸入 enve...

俄羅斯套娃信封問題

給定一些標記了寬度和高度的信封,寬度和高度以整數對形式 w,h 出現。當另乙個信封的寬度和高度都比這個信封大的時候,這個信封就可以放進另乙個信封裡,如同俄羅斯套娃一樣。請計算最多能有多少個信封能組成一組 俄羅斯套娃 信封 即可以把乙個信封放到另乙個信封裡面 說明 不允許旋轉信封。示例 輸入 enve...

俄羅斯套娃信封問題

題目 給定一些標記了寬度和高度的信封,寬度和高度以整數對形式 w,h 出現。當另乙個信封的寬度和高度都比這個信封大的時候,這個信封就可以放進另乙個信封裡,如同俄羅斯套娃一樣。請計算最多能有多少個信封能組成一組 俄羅斯套娃 信封 即可以把乙個信封放到另乙個信封裡面 說明 不允許旋轉信封。示例 輸入 e...