在C ++中将数组拆分为连续的子序列

假设我们有一个以升序排序的数组nums。当且仅当我们可以将其拆分为1或多个子序列,使得每个子序列由连续的整数组成且长度至少为3时,我们才必须返回true。因此,如果输入类似于[1,2,3,3,4, 4,5,5],则输出为True,因为我们有两个连续的序列。它们是[1,2,3,4,5]和[3,4,5]。

为了解决这个问题,我们将遵循以下步骤-

  • 制作一个映射m并将nums的频率存储到m中,将nums的大小存储到m中

  • cnt:= n

  • 对于i,范围为0至n – 1

    • 将cnt减小1,将m [x]减小1,将x增大1

    • x:= nums [i]

    • 如果m [x]和m [x + 1]和m [x + 2]

    • 将m [x],m [x + 1]和m [x + 2]减1,将x减3,将计数减3

    • 而m [x]> 0和m [x]> m [x – 1]

    • 如果cnt为0,则返回true,否则返回false

    • 让我们看下面的实现以更好地理解-

    示例

    #include <bits/stdc++.h>

    using namespace std;

    class Solution {

       public:

       bool isPossible(vector<int>& nums) {

          unordered_map <int, int> m;

          int n = nums.size();

          for(int i = 0; i < n; i++){

             m[nums[i]]++;

          }

          int cnt = n;

          for(int i = 0; i < n; i++){

             int x = nums[i];

             if(m[x] && m[x + 1] && m[x + 2]){

                m[x]--;

                m[x + 1]--;

                m[x + 2]--;

                x += 3;

                cnt -= 3;

                while(m[x] > 0 && m[x] > m[x - 1]){

                   cnt--;

                   m[x]--;

                   x++;

                }

             }

          }

          return cnt == 0;

       }

    };

    main(){

       vector<int> v = {1,2,3,3,4,4,5,5};

       Solution ob;

       cout << (ob.isPossible(v));

    }

    输入项

    [1,2,3,3,4,4,5,5]

    输出结果

    1

    以上是 在C ++中将数组拆分为连续的子序列 的全部内容, 来源链接: utcz.com/z/343490.html

    回到顶部