classSolution {public:intlengthOfLIS(vector<int>& nums) {returnfindLIS(nums,0,-1); }private:intfindLIS(vector<int>& nums,int curIdx,int prevIdx) {if(curIdx ==nums.size())return0;int c1 =0; // include the nums[curIdx] when it is larger than the previous included valueif(prevIdx ==-1||nums[curIdx] >nums[prevIdx]) { c1 =1+findLIS(nums, curIdx+1, curIdx); }int c2 =findLIS(nums, curIdx+1, prevIdx);returnmax(c1, c2); }};
這個做法會 TLE。
解法二 - Memoization
classSolution {public:intlengthOfLIS(vector<int>& nums) { vector<vector<int>>memo(nums.size()+1,vector<int>(nums.size()+1,-1));returnfindLIS(memo, nums,0,-1); }private:intfindLIS(vector<vector<int>>& memo,vector<int>& nums,int curIdx,int prevIdx) {if(curIdx ==nums.size())return0;if(memo[curIdx+1][prevIdx+1] ==-1) {int c1 =0; // include the nums[curIdx] when it is larger than the previous included valueif(prevIdx ==-1||nums[curIdx] >nums[prevIdx]) { c1 =1+findLIS(memo, nums, curIdx+1, curIdx); }int c2 =findLIS(memo, nums, curIdx+1, prevIdx);memo[curIdx+1][prevIdx+1] =max(c1, c2); }returnmemo[curIdx+1][prevIdx+1]; }};
這樣解就可以過,不過效率不彰:
Runtime: 500 ms, faster than 5.76% of C++ online submissions for Longest Increasing Subsequence. Memory Usage: 111.5 MB, less than 6.25% of C++ online submissions for Longest Increasing Subsequence.
解法三 - DP
首先決定一下狀態,我們可以定義 dp[i] = 到數字 i 時,最長的 increasing sequence 是多長。所以,
dp[i] = dp[j]+1 if (dp[j]+1 > dp[i] && nums[i] > nums[j]) for all j < i