【leetcode编程题目354】俄罗斯套娃

来自 https://leetcode.com/problems/russian-doll-envelopes/

You have a number of envelopes with widths and heights given as a pair of integers (w, h). One envelope can fit into another if and only if both the width and height of one envelope is greater than the width and height of the other envelope.

What is the maximum number of envelopes can you Russian doll? (put one inside other)

Example:
Given envelopes = [[5,4],[6,4],[6,7],[2,3]], the maximum number of envelopes you can Russian doll is 3 ([2,3] => [5,4] => [6,7]).

 

这个题目是最长子序列的变形;最长子序列可以参考https://en.wikipedia.org/wiki/Longest_increasing_subsequence

本题目的解法:

1. 先将长方形按照宽排序,如果宽度一样, 按照高度降序排列,即 wi < wj or wi == wj && hi > hj; 这样得到的序列,从宽度考虑,前面的肯定可以放入后面的;对于wi == wj && hi > hj是因为在宽度一致的情况下,将更高的放在前面,可以保证后面根据高度查找最长子序列的时候,将这种组合排除;

2. 然后根据高度查找可以嵌套的最长子序列即可;

 

 

func maxEnvelopes(envelopes [][]int) int {
	sort.Sort(byShape(envelopes))

	m := make([]int, len(envelopes)+1, len(envelopes)+1)
	L := 0
	for i, a := range envelopes {
		lo, hi := 1, L
		for lo <= hi {
			mid := (lo + hi) / 2
			b := envelopes[m[mid]]
			if b[1] < a[1] {
				lo = mid + 1
			} else {
				hi = mid - 1
			}
		}

		m[lo] = i
		if L < lo {
			L = lo
		}
	}

	return L
}

type byShape [][]int

func (a byShape) Len() int {
	return len(a)
}

func (a byShape) Less(i, j int) bool {
	if a[i][0] != a[j][0] {
		return a[i][0] < a[j][0]
	}

	return a[j][1] < a[i][1]
}

func (a byShape) Swap(i, j int) {
	a[i], a[j] = a[j], a[i]
}

 

转载于:https://my.oschina.net/u/922297/blog/689220

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LeetCode是一个著名的在线编程题库,可以帮助计算机程序员提升编程能力。LeetCode的题涵盖了算法、数据结构、字符串、数组、链表等多个方面的知识,对于求职面试以及算法竞赛准备非常有帮助。 LeetCode上的编程题分为简单、中等和困难三个难度级别。每个题都有详细的题描述、输入输出示例以及参考答案等内容。在解决每个问题时,我们需要仔细阅读题,并根据题要求提供正确的解答。 通常,我们需要使用编程语言如Python、C++等来实现解题思路。在编码之前,我们需要先分析问题,并找到合适的算法或数据结构来解决问题。一般来说,我们可以使用递归、迭代、动态规划等方法来解决常见的编程问题。 在LeetCode上,我们可以提交解答,并测试解答是否通过了所有的测试用例。如果通过了所有的测试用例,我们就可以得到题的AC(Accepted)结果,并获得该题的通过证书。如果没有通过所有的测试用例,我们可以检查自己的解答,查找解答中的错误或者不完善之处,并进行修改和优化。 总之,LeetCode编程题是一个优秀的学习和练习编程的平台。通过解答LeetCode上的编程题,我们可以提升自己的编程能力,并且培养解决问题的思维方式。无论是求职面试还是算法竞赛,LeetCode编程题都是非常有帮助的资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值