เราได้รับอาร์เรย์ 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 เพื่อสร้างคู่แบบสุ่ม
-
เริ่มวนรอบ FOR จาก 0 จนถึงขนาดของอาร์เรย์ และภายในนั้นตั้งค่าของ arr[i] ภายใน unordered_map
-
ตอนนี้ คำนวณขนาดของ unordered_map และล้าง unordered_map
-
เริ่มการวนซ้ำ FOR จาก 0 จนถึงขนาดของอาร์เรย์
-
ภายในลูป เริ่ม WHILE จนถึง right
-
เพิ่มค่าล่วงหน้าของ um[arr[right]]
-
ตอนนี้ ตรวจสอบว่า um[arr[right]] =1 แล้วเพิ่มค่าของ left ก่อน 1
-
นอก WHILE ให้เพิ่มค่าของ right ล่วงหน้า 1
-
ตรวจสอบ IF left =size of an unordered_map แล้วตั้งค่า count เป็น count + size - right + 1
-
ลด um[arr[i]] ลง 1
-
ตรวจสอบว่า um[arr[i]] =0 แล้วลดค่าทางซ้ายลง 1
-
คืนจำนวน
-
พิมพ์ผลลัพธ์
ตัวอย่าง
#includeใช้เนมสเปซ std;int sub_distinct(int arr[], ขนาด int){ จำนวนเต็ม =0, ขวา =0, ซ้าย =0; unordered_map อืม; สำหรับ (int i =0; i ผลลัพธ์
หากเราเรียกใช้โค้ดข้างต้น มันจะสร้างผลลัพธ์ต่อไปนี้ -
จำนวนอาร์เรย์ย่อยที่มีองค์ประกอบที่แตกต่างกันทั้งหมดเหมือนกับอาร์เรย์ดั้งเดิมคือ:1