| 1234567891011121314151617181920212223242526272829303132333435 | type nx2arr [][]intfunc (arr nx2arr) Len() int { return len(arr) }func (arr nx2arr) Less(i, j int) bool {	if arr[i][0] != arr[j][0] {		return arr[i][0] < arr[j][0]	} else {		return arr[j][1] < arr[i][1] // If the width is the same, the tallest is in front	}}func (arr nx2arr) Swap(i, j int) { arr[i], arr[j] = arr[j], arr[i] }func maxEnvelopes(envelopes [][]int) (n int) { // Just like "the longest increasing substring"	sort.Sort(nx2arr(envelopes))	queue := make([][]int, 0)	for i := range envelopes {		beg, end := 0, n-1		for beg <= end {			mid := beg + (end-beg)/2			if queue[mid][1] < envelopes[i][1] { // Binary search with duplicates				beg = mid + 1			} else if envelopes[i][1] <= queue[mid][1] {				end = mid - 1			}		}		if beg == n {			queue = append(queue, envelopes[i])			n++		} else {			queue[beg] = envelopes[i]		}	}	return}
 |