[动态规划] leetcode 673 Number of Longest Increasing Subsequence
problem:https://leetcode.com/problems/number-of-longest-increasing-subsequence/
这道题问的是最长的连续子序列的个数。这道题是XX子序列系列,是求最长连续子序列长度的升级版,关于求最长子序列长度,我们可以设定一个数组length,lenght[ i ] 代表以i为结尾的最长连续子序列长度,那么可以通过如下方式得到结果:
class Solution { public: int findNumberOfLIS(vector<int>& nums) { vector<int> length(nums.size(), 1); int maxLen = 1; for (int i = 0; i < nums.size(); i++) { for (int j = 0; j < i; j++) { if (nums[i] > nums[j]) { if (length[j] + 1 > length[i]) { length[i] = length[j] + 1; maxLen = max(maxLen, length[i]); } } } } return maxLen; } };
如果要记录个数,我的想法是在更新长度的同时更新个数。维护一个数组count,count[ i ] 代表以i为结尾的最长连续子序列的个数。之后遍历一遍count数组,把等于最大长度的count累加起来得到结果:
class Solution { public: int findNumberOfLIS(vector<int>& nums) { vector<int> length(nums.size(), 1); vector<int> count(nums.size(), 1); int maxLen = 1; for (int i = 0; i < nums.size(); i++) { for (int j = 0; j < i; j++) { if (nums[i] > nums[j]) { if (length[j] + 1 > length[i]) { length[i] = length[j] + 1; count[i] = count[j]; maxLen = max(maxLen, length[i]); } else if (length[j] + 1 == length[i]) { count[i] += count[j]; } } } } int res = 0; for (int i = 0; i < nums.size(); i++) { if (length[i] == maxLen) res += count[i]; } return res; } };

浙公网安备 33010602011771号