Problem 300: Longest Increasing Subsequence
Last updated
Last updated
public class Solution {
public int lengthOfLIS(int[] nums) {
if (nums == null || nums.length == 0) {
return 0;
}
int[] dp = new int[nums.length];
dp[0] = nums[0];
int index = 0;
for (int i = 1; i < nums.length; i++) {
int pos = binarySearch(dp, nums[i], index);
if (pos <= index) {
dp[pos] = nums[i];
} else {
index = pos;
dp[index] = nums[i];
}
}
return index + 1;
}
private int binarySearch(int[] dp, int val, int index) {
int left = 0, right = index;
while (left + 1 < right) {
int mid = left + (right - left) / 2;
if (val == dp[mid]) {
return mid;
} else if (val < dp[mid]) {
right = mid;
} else {
left = mid;
}
}
if (val <= dp[left]) {
return left;
} else if (val > dp[right]) {
return index + 1;
} else {
return right;
}
}
}for (int i = 0; i < nums.length; i++) {
f[i] = 1;
for (int j = 0; j < i; j++) {
if (nums[j] < nums[i]) {
f[i] = f[i] > f[j] + 1 ? f[i] : f[j] + 1;
}
}
if (f[i] > max) {
max = f[i];
}
}public class Solution {
public int lengthOfLIS(int[] nums) {
if (nums == null || nums.length == 0) {
return 0;
}
int max = 0;
int[] f = new int[nums.length];
for (int i = 0; i < nums.length; i++) {
f[i] = 1;
for (int j = 0; j < i; j++) {
if (nums[j] < nums[i]) {
f[i] = f[i] > f[j] + 1 ? f[i] : f[j] + 1;
}
}
if (f[i] > max) {
max = f[i];
}
}
return max;
}
}