2023-07-21 Daily Challenge

Today I have done leetcode's July LeetCoding Challenge with cpp.

July LeetCoding Challenge 21

Description

Number of Longest Increasing Subsequence

Given an integer array nums, return the number of longest increasing subsequences.

Notice that the sequence has to be strictly increasing.

 

Example 1:

Input: nums = [1,3,5,4,7]
Output: 2
Explanation: The two longest increasing subsequences are [1, 3, 4, 7] and [1, 3, 5, 7].

Example 2:

Input: nums = [2,2,2,2,2]
Output: 5
Explanation: The length of the longest increasing subsequence is 1, and there are 5 increasing subsequences of length 1, so output 5.

 

Constraints:

  • 1 <= nums.length <= 2000
  • -106 <= nums[i] <= 106

Solution

class Solution {
public:
  int findNumberOfLIS(vector<int>& nums) {
    if(nums.empty()) return 0;
    vector<int> LIS(nums.size(), 1);
    vector<int> ways(nums.size(), 1);
    for(int i = 1; i < nums.size(); ++i) {
      for(int j = 0; j < i; ++j) {
        if(nums[j] < nums[i] && LIS[j]+1 > LIS[i]) {
          ways[i] = ways[j];
          LIS[i] = LIS[j] + 1;
        } else if(nums[j] < nums[i] && LIS[j]+1 == LIS[i]) {
          ways[i] += ways[j];  
        } 
      }
    }
    int LISLength = *max_element(LIS.begin(), LIS.end());
    int ans = 0;
    for(int i = 0; i < nums.size(); ++i) {
      if(LIS[i] == LISLength) ans += ways[i];
    }
    return ans;
  }
};

// Accepted
// 223/223 cases passed (217 ms)
// Your runtime beats 43.24 % of cpp submissions
// Your memory usage beats 66.65 % of cpp submissions (13.2 MB)