Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

นับอาร์เรย์ย่อยที่มีองค์ประกอบที่แตกต่างกันทั้งหมดเหมือนกับอาร์เรย์ดั้งเดิมใน C++


เราได้รับอาร์เรย์ 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