Computer >> Máy Tính >  >> Lập trình >> C ++

Đếm các mảng con có tổng số phần tử riêng biệt giống như mảng ban đầu trong C ++

Chúng ta được cung cấp một mảng arr [] chứa các số nguyên. Mục đích là để đếm tất cả các mảng con của arr [] sao cho số phần tử riêng biệt trong mỗi mảng bằng với số phần tử riêng biệt trong mảng ban đầu. Nếu mảng ban đầu là [1,1,2,3] thì các mảng con sẽ là [1,2,3] và [1,1,2,3].

Tổng các phần tử khác biệt trong mảng ban đầu là 3. Tổng các phần tử khác biệt trong cả hai mảng con cũng là 3

Hãy cho chúng tôi hiểu với các ví dụ.

Đầu vào - arr [] ={1,2,1,2,3,4,2};

Đầu ra - Số mảng con có tổng số phần tử khác biệt giống với mảng ban đầu là - 6

Giải thích - Các phần tử phân biệt trong arr [] là 4 (1,2,3,4). Các mảng con có cùng số phần tử riêng biệt là:(đếm phân biệt từ trái sang phải)

[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 ]

Đầu vào - arr [] ={8,7,5,6,10};

Đầu ra - Số mảng con có tổng số phần tử khác biệt giống với mảng ban đầu là - 1

Giải thích - Các phần tử riêng biệt trong arr [] là 5 (5,6,7,8,10). Các mảng con có cùng số phần tử phân biệt là:(đếm phân biệt từ trái sang phải) [8,7,6,5,10]. 1 chỉ

Cách tiếp cận được sử dụng trong chương trình dưới đây như sau

  • Lấy một mảng [] gồm các số nguyên và tính kích thước của một mảng.

  • Hàm sub_ele_diff_one (int arr [], int size) nhận mảng và trả về số lượng các mảng con với các phần tử liên tiếp khác nhau bằng 1.

  • Lấy số lượng biến tạm thời và các biến bên phải và bên trái.

  • Lấy một biến kiểu unsrdered_map để tạo các cặp ngẫu nhiên.

  • Bắt đầu vòng lặp FOR từ 0 cho đến hết kích thước của một mảng và bên trong nó đặt giá trị của arr [i] bên trong bản đồ chưa có thứ tự.

  • Bây giờ, hãy tính toán kích thước của một bản đồ không có thứ tự và xóa bản đồ không có thứ tự.

  • Bắt đầu vòng lặp FOR từ 0 cho đến hết kích thước của một mảng.

  • Bên trong vòng lặp, bắt đầu WHILE cho đến phải

  • Tăng trước giá trị của ô [arr [right]]

  • Bây giờ, hãy kiểm tra xem um [arr [right]] =1 rồi tăng trước giá trị của trái lên 1.

  • Bên ngoài WHILE, tăng trước giá trị của quyền lên 1.

  • Kiểm tra NẾU left =kích thước của một bản đồ không có thứ tự, sau đó đặt số lượng thành đếm + kích thước - phải + 1

  • Giảm um [arr [i]] 1

  • Kiểm tra IF um [arr [i]] =0 rồi giảm bên trái 1

  • Trả lại số lượng

  • In kết quả.

Ví dụ

#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;
}

Đầu ra

Nếu chúng ta chạy đoạn mã trên, nó sẽ tạo ra kết quả sau -

Count of subarrays having total distinct elements same as original array are: 1