class Solution {
public int lengthOfLIS(int[] nums) {
if (nums.length == 1) return 1;
int[] LIS = new int[nums.length];
Arrays.fill(LIS, 1);
int maximumSoFar = 1;
for (int i = nums.length - 1; i >= 0; i--) {
for (int j = i + 1; j < nums.length; j++) {
if (nums[i] < nums[j]) {
LIS[i] = Math.max(1 + LIS[j], LIS[i]);
}
}
maximumSoFar = Math.max(maximumSoFar, LIS[i]);
}
return maximumSoFar;
}
public int lengthOfLIS(int[] nums) {
List<Integer> lis = new ArrayList<>(nums.length);
for (int n : nums) {
int i = Collections.binarySearch(lis, n);
if (i < 0) i = -i - 1;
if (i == lis.size())
lis.add(n);
else
lis.set(i, n);
}
return lis.size();
}
}