LIS
import java.util.*;
public class Solution {
/**
* retrun the longest increasing subsequence
* @param arr int整型一维数组 the array
* @return int整型一维数组
*/
public int[] LIS (int[] arr) {
// write code here
if(arr.length<=1||arr==null)
return arr;
int[]end=new int[arr.length+1];
int[]dp=new int[arr.length];
end[1]=arr[0];
int len=1;
dp[0]=1;
for(int i=1;i<arr.length;i++){
if(end[len]<arr[i]){//贪心
end[++len]=arr[i];//不能使用len++
dp[i]=len;
}else{
int l=0,r=len;
while(l<=r){//二分
int mid=(l+r)>>1;
if(end[mid]>=arr[i]){
r=mid-1;
}else
l=mid+1;
}
end[l]=arr[i];
dp[i]=l;
}
}
int[] res=new int[len];
for(int i=arr.length-1;i>=0;i--){
if(dp[i]==len){
res[--len]=arr[i];
}
}
return res;
}
}