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
// num记录每个数组能组成的最大序列;temp记录每个长度中最后一个位置的数字;
int[] nums = new int[arr.length];
int[] temp = new int[arr.length];
nums[0] = 1;
int tempindex = 0;
temp[tempindex] = arr[0];
if(arr.length==1) return arr;
for(int i=1;i<arr.length;i++){
int left=0,right=tempindex;
if(arr[i]==temp[tempindex]){
nums[i]=tempindex+1;
continue;
}
if(arr[i]>temp[tempindex]){
++tempindex;
nums[i]=tempindex+1;
temp[tempindex]=arr[i];
}else{
while(left<=right){
int mid = (right+left)/2;
if(temp[mid]>arr[i]){
right=mid-1;
}else{
left=mid+1;
}
}
temp[left]=arr[i];
nums[i]=left+1;
}
}
int[] res = new int[tempindex+1];
for(int i=nums.length-1;i>=0;--i){
if(nums[i]==tempindex+1){
res[tempindex]=arr[i];
--tempindex;
}
}
return res;
}
}