C ++中排序数组中的绝对唯一计数?

数组是相同数据类型的元素的集合。甲排序后的数组是具有存储在升序或降序排列的序列元素的数组。

唯一计数是不相同的元素数。

绝对唯一计数是元素的绝对值的唯一计数,即没有符号的元素(无符号值)。

在此程序中,我们将在排序数组中找到绝对不同的计数。也就是说,如果考虑数组中每个元素的绝对值,我们将计算不同值的数量。

例如,

Input : [-3 , 0 , 3 , 6 ]
Output : 3

数组中有3个不同的绝对值,元素分别是0、3和6。

为了解决这个问题,我们有使用不同方法的方法。

通过使用一套 

集合始终包含不同的元素。因此,我们将检查集合中的绝对值,如果不可用,何时将元素添加到集合中。并返回集合的大小。

算法-

  • 创建一组与数组相同的数据类型。

  • 查找每个元素的绝对值,然后将元素存储在数组中。该集合将存储一个值,即使遇到多个值也是如此。

  • 输入所有元素之后。返回集合的长度。这将给出数组中不同元素的数量。

示例

#include <bits/stdc++.h>
using namespace std;
int main() {
   int arr[] = {-3, 0, 2, 6};
   int n = sizeof(arr)/sizeof(arr[0]);
   cout << "绝对唯一值的计数: ";
   unordered_set<int> s;
   for (int i = 0 ; i < n; i++)
      s.insert(abs(arr[i]));
      int nof = s.size();
      cout<<nof;
      return 0;
}

输出结果

绝对唯一值的计数: 4

使用数组检查和计数变量 

此方法仅使用单个变量而不是集合。我们将为您提供一个count变量,以对数组的不同元素进行计数。

示例

#include <iostream>
using namespace std;
int main() {
   int arr[] = {-5, -1, 0, 5, 8};
   int n = sizeof(arr)/sizeof(arr[0]);
   cout << "绝对唯一值的计数: ";
   int count = n;
   int i = 0, j = n - 1, sum = 0;
   while (i < j) {
      while (i != j && arr[i] == arr[i + 1])
         count--, i++;
      while (i != j && arr[j] == arr[j - 1])
         count--, j--;
      if (i == j)
         break;
      sum = arr[i] + arr[j];
      if (sum == 0) {
         count--;
         i++, j--;
      }
      else if(sum < 0)
         i++;
      else
         j--;
   }
   cout<< count;
   return 0;
}

输出结果

绝对唯一值的计数: 4