给 n 个信封的长度和宽度。如果信封 a 的长和宽都小于信封 b ,那么信封 a 可以放到信封 b 里,请求出信封最多可以嵌套多少层。
数据范围: ,
要求:空间复杂度 ,时间复杂度
进阶:空间复杂度 ,时间复杂度
进阶:空间复杂度 ,时间复杂度
[[3,4],[2,3],[4,5],[1,3],[2,2],[3,6],[1,2],[3,2],[2,4]]
4
从里到外分别是{1,2},{2,3},{3,4},{4,5}。
[[1,4],[4,1]]
1
时间复杂度O(nlog n),空间复杂度O(n)。
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param letters int二维数组 * @return int */ public int maxLetters (int[][] letters) { // write code here Arrays.sort(letters, (a, b) -> a[0] != b[0]? a[0] - b[0]: b[1] - a[1]); int n = letters.length; int[] ends = new int[n]; // ends[i]表示长度为i+1的递增子序列最小结尾 ends[0] = letters[0][1]; int maxLen = 1, tail = 0; // 最长递增子序列长度与ends数组的有效区末尾下标 for(int i = 1; i < n; i++){ int index = lowerbound(ends, 0, tail, letters[i][1]); ends[index] = letters[i][1]; if(index > tail){ // ends数组的有效区没能找到第一个大于等于letters[i][1]的区域,就扩充ends数组有效区 tail ++; } maxLen = Math.max(maxLen, index + 1); } return maxLen; } private int lowerbound(int[] arr, int L, int R, int target) { int left = L, right = R, idx = R + 1; while(left <= right){ int mid = left + ((right - left) >> 1); if(arr[mid] < target){ left = mid + 1; }else{ idx = mid; right = mid - 1; } } return idx; } }