เราได้รับอาร์เรย์ arr[] เป้าหมายคือนับ subarray ที่จำนวน distinct elements (ค่าที่ไม่ซ้ำ) เท่ากับอาร์เรย์ต้นฉบับ
ตัวอย่าง
อินพุต: arr[] = {1, 2, 1, 2, 3, 4, 2}
เอาต์พุต: 6
คำอธิบาย: Distinct ในอาร์เรย์ต้นฉบับ = 4 (1,2,3,4) Subarrays ที่มี distinct 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
คำอธิบาย: Distinct = 5 มีแค่ subarray เดียวคืออาร์เรย์ทั้งหมด
แนวทางการแก้ปัญหา (Sliding Window + Hash Map)
- หาจำนวน distinct elements ทั้งหมดในอาร์เรย์ (
um_size) - ใช้ sliding window 2 จุด (
left,right) และ hash map นับความถี่ - ขยาย
rightจนกว่า window จะมี distinct elements ครบum_size - เมื่อครบแล้ว subarray เริ่มจาก
leftถึงสิ้นสุดจะ valid ทั้งหมด นับเพิ่มsize - right + 1 - เลื่อน
leftต่อไป อัปเดต hash map
การนำไปใช้ (Implementation)
#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;
// หาจำนวน distinct ทั้งหมด
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 += (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