https://leetcode.com/problems/longest-increasing-subsequence/
// class Solution {
// //动态规划。在i位置上的dp值,应该是两者额较大值:1.原dp 2.比nums[i]小的nums[j]的j位置上的dp值加一
// public int lengthOfLIS(int[] nums) {
// if(nums==null || nums.length==0) return 0;
// int[] dp = new int[nums.length];
// int res = 0;
// for(int i=0; i<nums.length; i++){
// for(int j=0; j<=i; j++){
// if(nums[j]<nums[i]){
// dp[i] = Math.max(dp[i], dp[j]+1);
// }
// }
// res = Math.max(dp[i], res);
// }
// return res+1;
// }
// }
class Solution {
//nlogn的解法 https://blog.csdn.net/jmspan/article/details/51171519
//https://www.jianshu.com/p/a3cd9df6d9d1
public int lengthOfLIS(int[] nums) {
int[] increasing = new int[nums.length];
int size = 0; //increasing数组中放置的元素个数
for(int i=0; i<nums.length; i++) {
int left=0, right=size-1;
while (left<=right) { //二分查找increasing数组中第一个比nums[i]大的元素
int m=(left+right)/2;
if (nums[i] > increasing[m]) left = m + 1;
else right = m - 1;
}
increasing[left] = nums[i];
if (left==size) size ++;
}
return size;
}
}