給定一些標記了寬度和高度的信封,寬度和高度以整數對形式 (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
]=
maxj=
0...if
[j]+
1f[i] =\max_
f[i]=j
=0..
.imaxf[
j]+1
m ax
val=
maxi=
0...nf
[i
]maxval =\max_
maxval
=i=0
...n
maxf[
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
]=
maxj=
0...if
[j]+
1f[i] =\max_
f[i]=j
=0..
.imaxf[
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...