354. 俄罗斯套娃信封问题
俄罗斯套娃信封问题
题目描述:
给你一个二维整数数组 envelopes ,其中 envelopes[i] = [wi, hi] ,表示第 i 个信封的宽度和高度。
当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。
请计算 最多能有多少个 信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。
注意:不允许旋转信封。
示例 1:
输入:envelopes = [[5,4],[6,4],[6,7],[2,3]]
输出:3
解释:最多信封的个数为 3, 组合为: [2,3] => [5,4] => [6,7]。
示例 2:
输入:envelopes = [[1,1],[1,1],[1,1]]
输出:1
提示:
1 <= envelopes.length <= 5000
envelopes[i].length == 2
1 <= wi, hi <= 104
思路:
把二维排序 先固定一维,就变成了一维问题,先按第一列升序,第二列降序排序,之后就变成第二列的最大升序问题,就可以求出答案
代码:
func maxEnvelopes(envelopes [][]int) int {
myarr:=&Intarr{envelopes,0}
sort.Sort(myarr)
max:=lengthOfLIS(envelopes)
return max
}
type Intarr struct {
marr [][]int
line int
}
func (arr *Intarr)Len() int {
return len(arr.marr)
}
func (arr *Intarr)Swap(i,j int) {
arr.marr[i],arr.marr[j]=arr.marr[j],arr.marr[i]
}
func (arr *Intarr)Less(i,j int)bool{
if arr.marr[i][arr.line] < arr.marr[j][arr.line]{
return true
}else if arr.marr[i][arr.line] > arr.marr[j][arr.line]{
return false
}else{
if arr.marr[i][1]>arr.marr[j][1]{
return true
}else{
return false
}
}
}
func lengthOfLIS(nums [][]int) int {
if nums==nil{
return 0
}
var dp [5001]int
var max int
for i:=0 ;i<5001;i++{
dp[i]=1
}
for i:=1;i<len(nums);i++{
max =1
for j:=0;j<i;j++{
if nums[i][1]>nums[j][1]{
if max<dp[j]+1{
max = dp[j]+1
}
}
}
dp[i] = max
}
for i:=0;i<len(nums);i++{
if max < dp[i]{
max = dp[i]
}
}
return max
}
代码效率:
执行用时:268 ms, 在所有 Go 提交中击败了42.09%的用户
内存消耗:6.3 MB, 在所有 Go 提交中击败了99.65%的用户
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!