Longest Increasing Subsequence
Find the length of the longest strictly increasing subsequence using O(n^2) dynamic programming.
Sample input
[10, 9, 2, 5, 3, 7, 101, 18]
Sample output
4
Solution
def length_of_lis(nums):
if not nums:
return 0
dp = [1] * len(nums)
for i in range(len(nums)):
for j in range(i):
if nums[j] < nums[i]:
dp[i] = max(dp[i], dp[j] + 1)
return max(dp)
print(length_of_lis([10, 9, 2, 5, 3, 7, 101, 18]))
function lengthOfLIS(nums) {
if (nums.length === 0) return 0;
const dp = new Array(nums.length).fill(1);
for (let i = 0; i < nums.length; i++) {
for (let j = 0; j < i; j++) {
if (nums[j] < nums[i]) dp[i] = Math.max(dp[i], dp[j] + 1);
}
}
return Math.max(...dp);
}
console.log(lengthOfLIS([10, 9, 2, 5, 3, 7, 101, 18]));
import java.util.Arrays;
public class Main {
static int lengthOfLIS(int[] nums) {
if (nums.length == 0) return 0;
int[] dp = new int[nums.length];
Arrays.fill(dp, 1);
int best = 1;
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);
}
best = Math.max(best, dp[i]);
}
return best;
}
public static void main(String[] args) {
System.out.println(lengthOfLIS(new int[]{10, 9, 2, 5, 3, 7, 101, 18}));
}
}
fun lengthOfLIS(nums: IntArray): Int {
if (nums.isEmpty()) return 0
val dp = IntArray(nums.size) { 1 }
var best = 1
for (i in nums.indices) {
for (j in 0 until i) {
if (nums[j] < nums[i]) dp[i] = maxOf(dp[i], dp[j] + 1)
}
best = maxOf(best, dp[i])
}
return best
}
fun main() {
println(lengthOfLIS(intArrayOf(10, 9, 2, 5, 3, 7, 101, 18)))
}
func lengthOfLIS(_ nums: [Int]) -> Int {
if nums.isEmpty { return 0 }
var dp = [Int](repeating: 1, count: nums.count)
var best = 1
for i in 0..<nums.count {
for j in 0..<i {
if nums[j] < nums[i] {
dp[i] = max(dp[i], dp[j] + 1)
}
}
best = max(best, dp[i])
}
return best
}
print(lengthOfLIS([10, 9, 2, 5, 3, 7, 101, 18]))
int lengthOfLIS(List<int> nums) {
if (nums.isEmpty) return 0;
final dp = List.filled(nums.length, 1);
int best = 1;
for (var i = 0; i < nums.length; i++) {
for (var j = 0; j < i; j++) {
if (nums[j] < nums[i] && dp[j] + 1 > dp[i]) dp[i] = dp[j] + 1;
}
if (dp[i] > best) best = dp[i];
}
return best;
}
void main() {
print(lengthOfLIS([10, 9, 2, 5, 3, 7, 101, 18]));
}
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int lengthOfLIS(const vector<int>& nums) {
if (nums.empty()) return 0;
vector<int> dp(nums.size(), 1);
int best = 1;
for (int i = 0; i < (int) nums.size(); i++) {
for (int j = 0; j < i; j++) {
if (nums[j] < nums[i]) dp[i] = max(dp[i], dp[j] + 1);
}
best = max(best, dp[i]);
}
return best;
}
int main() {
cout << lengthOfLIS({10, 9, 2, 5, 3, 7, 101, 18}) << endl;
return 0;
}
#include <stdio.h>
int lengthOfLIS(int *nums, int n) {
if (n == 0) return 0;
int dp[100];
int best = 1;
for (int i = 0; i < n; i++) {
dp[i] = 1;
for (int j = 0; j < i; j++) {
if (nums[j] < nums[i] && dp[j] + 1 > dp[i]) dp[i] = dp[j] + 1;
}
if (dp[i] > best) best = dp[i];
}
return best;
}
int main() {
int nums[] = {10, 9, 2, 5, 3, 7, 101, 18};
printf("%d\n", lengthOfLIS(nums, 8));
return 0;
}