备战秋招之算法篇-动态规划(3)

3.动态规划-二维递增子序列:信封嵌套问题

本文内容来自github:labuladong 的算法教程,学习完之后做的笔记,大家可以去github看一下写的非常好。

3.1 题目描述

    给出一些信封,每个信封用宽度和高度的整数对形式(w,h)表示。当一个信封A的宽度和高度都比另一个信封B大的时候,则B就可以放进A里,请问最多能套几层?
    比如输入envlopes = [[5,4],[6,4],[6,7],[2,3]],算法返回3,因为最多有3个信封能够套起来,他们是[2,3]=>[5,4]=>[6,7].

3.2 思路分析

    先对宽度w进行升序排列,如果遇到w相同的情况,则按照高度h降序排列。之后把所有的h作为一个数组,在这个数组上计算出的LIS的长度就是答案。
    因为两个w相同的信封不能相互包含,w相同时将h逆序排列,则这些逆序h中组多只会有一个入选递增子序列,保证了最终的信封中不会出现w相同的情况。

int maxEnvelopes(int[][] envelopes){
	int n = envelopes.length();
	Arrays.sort(envelopes,new Comparator<int[]>(){
		public int compare(int[] a,int[] b){
			return a[0] == b[0] ? b[1] - a[1] : a[0] - b[0];
		}
	});
	int[] height = new int[n];
	for(int i=0;i<n;i++)
		height[i] = envelopes[i][1];
	return lengthOfLIS(height);
}

时间复杂度:O(nlogn).

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

li_jeremy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值