給定一些標記了寬度和高度的信封,寬度和高度以整數對形式(w, h)
出現。當另乙個信封的寬度和高度都比這個信封大的時候,這個信封就可以放進另乙個信封裡,如同俄羅斯套娃一樣。
請計算最多能有多少個信封能組成一組「俄羅斯套娃」信封(即可以把乙個信封放到另乙個信封裡面)。
說明:
不允許旋轉信封。
示例:
輸入: envelopes = [[5,4],[6,4],[6,7],[2,3]]
輸出: 3
解釋: 最多信封的個數為 3, 組合為: [2,3] => [5,4] => [6,7]。
暴力的動態規劃方法(可能超時)
public
intmaxenvelopes
(int
envelopes)}}
//對於每個信封,它能塞進的信封都只可能出現在它右側
//res記錄以第i個信封為最後乙個(套娃中最小的套娃),它的「俄羅斯套娃」信封個數。例如長寬最大的信封,res[i]=1
//從右往左遍歷,對於第i個信封,遍歷其i+1至最後乙個信封。
//如果當前信封的長和寬都比第i個信封的大,那麼更新res陣列:
//res[i] = math.max(res[i],res[j]+1);
int[
] res =
newint
[envelopes.length]
;for
(int i = envelopes.length-
1;i>=
0;i--)}
resnum = math.
max(resnum,res[i]);
}return resnum;
}
轉換為求最長遞增子串行問題
我們將寬度由小到大排序,同樣寬度的信封要求高度由大到小。
高度所組成的陣列,求最長的上公升子串行,其值就是信封的最大值。
個人的一些理解:假設高度所組成的陣列中有個高度h,如果它之前有乙個比h還小的高度h0,就可以吧子串行長度+1(信封問題中就表示可以把h0塞到h信封中)。因為h的寬度一定比h0大,這已經事先排序完成了。
public
intmaxenvelopes
(int
envelopes)}}
//對於排序完之後的高度h,求最長上公升子串行
int res =0;
int[
] dp =
newint
[envelopes.length]
;for
(int i =
0;i}//返回dp中的最大值即可
for(
int i:dp)
return res;
}
俄羅斯套娃信封問題
給定一些標記了寬度和高度的信封,寬度和高度以整數對形式 w,h 出現。當另乙個信封的寬度和高度都比這個信封大的時候,這個信封就可以放進另乙個信封裡,如同俄羅斯套娃一樣。請計算最多能有多少個信封能組成一組 俄羅斯套娃 信封 即可以把乙個信封放到另乙個信封裡面 說明 不允許旋轉信封。示例 輸入 enve...
俄羅斯套娃信封問題
給定一些標記了寬度和高度的信封,寬度和高度以整數對形式 w,h 出現。當另乙個信封的寬度和高度都比這個信封大的時候,這個信封就可以放進另乙個信封裡,如同俄羅斯套娃一樣。請計算最多能有多少個信封能組成一組 俄羅斯套娃 信封 即可以把乙個信封放到另乙個信封裡面 說明 不允許旋轉信封。示例 輸入 enve...
俄羅斯套娃信封問題
題目 給定一些標記了寬度和高度的信封,寬度和高度以整數對形式 w,h 出現。當另乙個信封的寬度和高度都比這個信封大的時候,這個信封就可以放進另乙個信封裡,如同俄羅斯套娃一樣。請計算最多能有多少個信封能組成一組 俄羅斯套娃 信封 即可以把乙個信封放到另乙個信封裡面 說明 不允許旋轉信封。示例 輸入 e...