给我们一个包含整数的数组arr []。目的是计算arr []的所有子数组,以使每个子数组中的不同元素数与原始数组中的不同元素数相同。如果原始数组为[1,1,2,3],则子数组将为[1,2,3]和[1,1,2,3]。
原始数组中的不同元素总数为3。两个子数组中的不同元素总数也为3。
让我们通过示例来理解。
输入− arr [] = {1,2,1,2,3,4,2};
输出-具有与原始数组相同的不同元素的子数组的计数为-6
说明-arr []中的不同元素是4(1,2,3,4)。具有相同数量的不同元素的子数组是:(从左到右计数不同)
[1,2,1,2,3,4], [2,1,2,3,4], [1,2,3,4], [1,2,3,4,2], [2,1,2,3,4,2], [1,2,1,2,3,4,2 ]
输入− arr [] = {8,7,5,6,10};
输出-具有与原始数组相同的不同元素的子数组的计数为-1
说明-arr []中的不同元素为5(5,6,7,8,10)。具有相同数量的不同元素的子数组是:(从左到右计数不同)[8,7,6,5,10]。仅1
取整数的数组arr []并计算数组的大小。
函数sub_ele_diff_one(int arr [],int size)获取数组,并返回连续元素相差1的子数组计数。
进行临时变量计数,并向左和向右进行变量。
使用类型为unordered_map的变量来创建随机对。
从0开始循环FOR,直到一个数组的大小为止,并在其中设置unordered_map内部的arr [i]值。
现在,计算unordered_map的大小并清除unordered_map。
从0开始启动FOR循环,直到数组大小为止。
在循环内,开始WHILE直到unordered_map的right <size和left <size
预增um [arr [right]]的值
现在,检查um [arr [right]] = 1,然后将left的值预加1。
在WHILE之外,将right的值预加1。
检查IF左边= unordered_map的大小,然后将count设置为count + size-right +1
将um [arr [i]]减1
检查IF um [arr [i]] = 0,然后将左减1
返回计数
打印结果。
#include <bits/stdc++.h>
using namespace std;
int sub_distinct(int arr[], int size){
   int count = 0, right = 0, left = 0;
   unordered_map<int, int> um;
   for (int i = 0; i < size; ++i){
      um[arr[i]] = 1;
   }
   int um_size = um.size();
   um.clear();
   for(int i = 0; i < size; ++i){
      while (right < size && left < um_size){
         ++um[arr[right]];
         if (um[arr[right]] == 1){
            ++left;
         }
         ++right;
      }
      if (left == um_size){
         count = count + (size - right + 1);
      }
      --um[arr[i]];
      if (um[arr[i]] == 0){
         --left;
      }
   }
   return count;
}
int main(){
   int arr[] = {4, 3, 2, 5};
   int size = sizeof(arr) / sizeof(arr[0]);
   cout<<"Count of subarrays having total distinct elements same as original array are: "<<sub_distinct(arr, size);
   return 0;
}输出结果
如果我们运行上面的代码,它将生成以下输出-
Count of subarrays having total distinct elements same as original array are: 1