最長增長子序列(串),最大公共子序列(串),
阿新 • • 發佈:2019-01-11
子序列,不需要連續的。
思路一:傳統的dp,dp[i]表示前i個數且以第i個數字結尾的最長增長子序列,遍歷陣列,dp[i] = max(dp[i], dp[j] + 1) if nums[i] > nums[j], j from 0 to i
思路二:維護一個數組,vec[i]表示,當遞增序列長度是i的時候最後一個數的最小值
程式碼:
class Solution { public: int lengthOfLIS(vector<int>& nums) { // version 1: traditonal dp /* vector<int> dp(nums.size(), 1); int res = 0; for (int i = 0; i < nums.size(); ++i) { for (int j = 0; j < i; ++j) { if (nums[i] > nums[j]) { dp[i] = max(dp[i], dp[j] + 1); } } res = max(res, dp[i]); } return res; */ // version 2: DP & BS /* vector<int> dp; for (int i = 0; i < nums.size(); ++i) { int left = 0, right = dp.size(); while (left < right) { int mid = left + (right - left) / 2; if (dp[mid] < nums[i]) left = mid + 1; else right = mid; } if (right >= dp.size()) dp.push_back(nums[i]); else dp[right] = nums[i]; } return dp.size(); */ // version 3: DP & lower_bound function in C++ STL instead of BS vector<int> v; for (auto a : nums) { auto it = lower_bound(v.begin(), v.end(), a); if (it == v.end()) v.push_back(a); else *it = a; } return v.size(); } };