Recursion (Brute Force)
Intuition
We can generate all possible subsequences and check which ones are strictly increasing, returning the length of the longest one. For each element, we decide whether to include it (if it is greater than the previous element in the subsequence) or skip it. This explores all 2^n subsets, leading to exponential time.
Algorithm
- Define a recursive function with parameters: current index and the value of the last chosen element.
- At each index, either skip the element or include it (if it is greater than the last chosen element).
- Return the maximum length found among all valid choices.
O(2^n)SpaceO(n) for the recursion stackCode (C++ · Java · Python · Go)
class Solution {
public:
int helper(vector<int>& nums, int idx, int prev) {
if (idx == nums.size()) return 0;
int skip = helper(nums, idx + 1, prev);
int take = 0;
if (nums[idx] > prev) {
take = 1 + helper(nums, idx + 1, nums[idx]);
}
return max(skip, take);
}
int lengthOfLIS(vector<int>& nums) {
return helper(nums, 0, INT_MIN);
}
};class Solution {
private int helper(int[] nums, int idx, int prev) {
if (idx == nums.length) return 0;
int skip = helper(nums, idx + 1, prev);
int take = 0;
if (nums[idx] > prev) {
take = 1 + helper(nums, idx + 1, nums[idx]);
}
return Math.max(skip, take);
}
public int lengthOfLIS(int[] nums) {
return helper(nums, 0, Integer.MIN_VALUE);
}
}from typing import List
class Solution:
def lengthOfLIS(self, nums: List[int]) -> int:
def helper(idx: int, prev: float) -> int:
if idx == len(nums):
return 0
skip = helper(idx + 1, prev)
take = 0
if nums[idx] > prev:
take = 1 + helper(idx + 1, nums[idx])
return max(skip, take)
return helper(0, float('-inf'))func lengthOfLIS(nums []int) int {
var helper func(idx int, prev int) int
helper = func(idx int, prev int) int {
if idx == len(nums) {
return 0
}
skip := helper(idx+1, prev)
take := 0
if nums[idx] > prev {
take = 1 + helper(idx+1, nums[idx])
}
if skip > take {
return skip
}
return take
}
return helper(0, -1<<31)
}