1. Recursive Exhaustive Search
Intuition
For each element, decide whether to include it in the increasing subsequence (if greater than previous chosen element) or skip it.
Algorithm
- Define
dfs(idx, prevIdx). - If
idx == nums.length, return 0. - Option 1: skip
dfs(idx + 1, prevIdx). - Option 2: if
prevIdx == -1ornums[idx] > nums[prevIdx]:1 + dfs(idx + 1, idx). - Return max(Option 1, Option 2).
#include <iostream>#include <vector>#include <algorithm> using namespace std; int dfs(int idx, int prevIdx, const vector<int>& nums) { if (idx == (int)nums.size()) return 0; int skip = dfs(idx + 1, prevIdx, nums); int take = 0; if (prevIdx == -1 || nums[idx] > nums[prevIdx]) { take = 1 + dfs(idx + 1, idx, nums); } return max(skip, take);} int lengthOfLISRec(vector<int>& nums) { return dfs(0, -1, nums);} int main() { vector<int> nums = {10, 9, 2, 5, 3, 7, 101, 18}; cout << "LIS (Recursive): " << lengthOfLISRec(nums) << endl; return 0;}Time & Space Complexity
- Time complexity:
O(2^n) - Space complexity:
O(n) call stack