| 1234567891011121314151617181920212223242526272829303132333435 | 
							- type nx2arr [][]int
 
- func (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
 
- }
 
 
  |