int lengthOfLIS(vector<int>& nums) {
function<int(int)> longestFrom = [&](int i) -> int {
int best = 1;
for (int j = i + 1; j < (int)nums.size(); j++) {
if (nums[j] > nums[i]) best = max(best, 1 + longestFrom(j));
}
return best;
};
int answer = 0;
for (int i = 0; i < (int)nums.size(); i++) answer = max(answer, longestFrom(i));
return answer;
}
public int lengthOfLIS(int[] nums) {
int answer = 0;
for (int i = 0; i < nums.length; i++) answer = Math.max(answer, longestFrom(nums, i));
return answer;
}
private int longestFrom(int[] nums, int i) {
int best = 1;
for (int j = i + 1; j < nums.length; j++) {
if (nums[j] > nums[i]) best = Math.max(best, 1 + longestFrom(nums, j));
}
return best;
}
def length_of_lis(nums):
def longest_from(i):
best = 1
for j in range(i + 1, len(nums)):
if nums[j] > nums[i]: best = max(best, 1 + longest_from(j))
return best
answer = 0
for i in range(len(nums)): answer = max(answer, longest_from(i))
return answer
function lengthOfLIS(nums: number[]): number {
const from = (i: number): number => {
let best = 1;
for (let j = i + 1; j < nums.length; j++) {
if (nums[j] > nums[i]) best = Math.max(best, 1 + from(j));
}
return best;
};
let answer = 0;
for (let i = 0; i < nums.length; i++) answer = Math.max(answer, from(i));
return answer;
}
int lengthOfLIS(vector<int>& nums) {
vector<int> memo(nums.size(), 0);
function<int(int)> longestFrom = [&](int i) -> int {
if (memo[i] > 0) return memo[i];
int best = 1;
for (int j = i + 1; j < (int)nums.size(); j++) {
if (nums[j] > nums[i]) best = max(best, 1 + longestFrom(j));
}
memo[i] = best;
return best;
};
int answer = 0;
for (int i = 0; i < (int)nums.size(); i++) answer = max(answer, longestFrom(i));
return answer;
}
public int lengthOfLIS(int[] nums) {
int[] memo = new int[nums.length];
int answer = 0;
for (int i = 0; i < nums.length; i++) answer = Math.max(answer, longestFrom(nums, memo, i));
return answer;
}
private int longestFrom(int[] nums, int[] memo, int i) {
if (memo[i] > 0) return memo[i];
int best = 1;
for (int j = i + 1; j < nums.length; j++) {
if (nums[j] > nums[i]) best = Math.max(best, 1 + longestFrom(nums, memo, j));
}
memo[i] = best;
return best;
}
def length_of_lis(nums):
memo = [0] * len(nums)
def longest_from(i):
if memo[i] > 0: return memo[i]
best = 1
for j in range(i + 1, len(nums)):
if nums[j] > nums[i]: best = max(best, 1 + longest_from(j))
memo[i] = best
return best
answer = 0
for i in range(len(nums)): answer = max(answer, longest_from(i))
return answer
function lengthOfLIS(nums: number[]): number {
const memo = new Array<number>(nums.length).fill(0);
const from = (i: number): number => {
if (memo[i] > 0) return memo[i];
let best = 1;
for (let j = i + 1; j < nums.length; j++) {
if (nums[j] > nums[i]) best = Math.max(best, 1 + from(j));
}
memo[i] = best;
return best;
};
let answer = 0;
for (let i = 0; i < nums.length; i++) answer = Math.max(answer, from(i));
return answer;
}
int lengthOfLIS(vector<int>& nums) {
int n = nums.size();
vector<int> dp(n, 1);
int answer = 0;
for (int i = n - 1; i >= 0; i--) {
for (int j = i + 1; j < n; j++) {
if (nums[j] > nums[i]) dp[i] = max(dp[i], 1 + dp[j]);
}
answer = max(answer, dp[i]);
}
return answer;
}
public int lengthOfLIS(int[] nums) {
int n = nums.length;
int[] dp = new int[n];
Arrays.fill(dp, 1);
int answer = 0;
for (int i = n - 1; i >= 0; i--) {
for (int j = i + 1; j < n; j++) {
if (nums[j] > nums[i]) dp[i] = Math.max(dp[i], 1 + dp[j]);
}
answer = Math.max(answer, dp[i]);
}
return answer;
}
def length_of_lis(nums):
n = len(nums)
dp = [1] * n
answer = 0
for i in range(n - 1, -1, -1):
for j in range(i + 1, n):
if nums[j] > nums[i]: dp[i] = max(dp[i], 1 + dp[j])
answer = max(answer, dp[i])
return answer
function lengthOfLIS(nums: number[]): number {
const n = nums.length;
const dp = new Array<number>(n).fill(1);
let answer = 0;
for (let i = n - 1; i >= 0; i--) {
for (let j = i + 1; j < n; j++) {
if (nums[j] > nums[i]) dp[i] = Math.max(dp[i], 1 + dp[j]);
}
answer = Math.max(answer, dp[i]);
}
return answer;
}
int lengthOfLIS(vector<int>& nums) {
vector<int> tails;
for (int x : nums) {
int lo = 0, hi = tails.size();
while (lo < hi) {
int mid = (lo + hi) >> 1;
if (tails[mid] < x) lo = mid + 1;
else hi = mid;
}
if (lo == (int)tails.size()) tails.push_back(x); else tails[lo] = x;
}
return tails.size();
}
public int lengthOfLIS(int[] nums) {
List<Integer> tails = new ArrayList<>();
for (int x : nums) {
int lo = 0, hi = tails.size();
while (lo < hi) {
int mid = (lo + hi) >> 1;
if (tails.get(mid) < x) lo = mid + 1;
else hi = mid;
}
if (lo == tails.size()) tails.add(x); else tails.set(lo, x);
}
return tails.size();
}
def length_of_lis(nums):
tails = []
for x in nums:
lo, hi = 0, len(tails)
while lo < hi:
mid = (lo + hi) >> 1
if tails[mid] < x: lo = mid + 1
else: hi = mid
if lo == len(tails): tails.append(x)
else: tails[lo] = x
return len(tails)
function lengthOfLIS(nums: number[]): number {
const tails: number[] = [];
for (const x of nums) {
let lo = 0, hi = tails.length;
while (lo < hi) {
const mid = (lo + hi) >> 1;
if (tails[mid] < x) lo = mid + 1;
else hi = mid;
}
tails[lo] = x;
}
return tails.length;
}