题目:
给定一个无序的整数数组,找到其中最长上升子序列的长度。
示例:
输入: [10,9,2,5,3,7,101,18]
输出: 4
解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。
思路:
生成一个最长子序列动态规划数组
从后往前遍历,得到一个当前最长情况下,每个节点都最小的子序列数组。
遍历每个数,二分查找这个数在数组中能替换的位置。
替换的条件是,长于最大值,则放在最后,否则嵌入刚好小于某个数的位置
class Solution {
public int lengthOfLIS(int[] nums) {
int[] tails = new int[nums.length];
int res = 0;
for(int num : nums) {
int i = 0, j = res;
while(i < j) {
int m = (i + j) / 2;
if(tails[m] < num) i = m + 1;
else j = m;
}
tails[i] = num;
if(res == j) res++;
}
return res;
}
}