เราได้รับอาร์เรย์ของจำนวนเต็มบวก เป้าหมายคือการค้นหาอาร์เรย์ย่อยของตัวเลขในอาร์เรย์ โดยที่แต่ละอาร์เรย์ย่อยมีจำนวนองค์ประกอบคู่และคี่เท่ากัน ถ้าอาร์เรย์เป็น { 1,2,3,4 } จากนั้นอาร์เรย์ย่อยจะเป็น {1,2}, {2,3}, {3,4}, {1,2,3,4} จำนวนอาร์เรย์ย่อยดังกล่าวคือ 4
ให้เราเข้าใจด้วยตัวอย่าง
ป้อนข้อมูล − arr[] ={1,3,5,7,8,3,2 };
ผลผลิต − จำนวนอาร์เรย์ย่อยที่มีองค์ประกอบคู่และคี่เท่ากันคือ − 4
คำอธิบาย − อาร์เรย์ย่อยจะเป็น − { 7,8 }, {8,3} {3,2}, {7,8,3,2}
ป้อนข้อมูล − arr[] ={2,4,6 };
ผลผลิต − จำนวนอาร์เรย์ย่อยที่มีองค์ประกอบคู่และคี่เท่ากันคือ − 0
คำอธิบาย − องค์ประกอบทั้งหมดเท่ากัน
แนวทางที่ใช้ในโปรแกรมด้านล่างมีดังนี้
ในแนวทางนี้ เราจะใช้ตัวแปร temp เป็นค่าความแตกต่างระหว่างองค์ประกอบอาร์เรย์ (เริ่มแรก 0) และเพิ่มขึ้น 1 ถ้า arr[i] เป็นเลขคี่ และลดค่าลง 1 ถ้า arr[i] เป็นเลขคู่ เมื่อค่าของ temp เกิดขึ้นซ้ำแล้วซ้ำอีก จะต้องมีอาร์เรย์ย่อยที่มีจำนวนเลขคู่คี่เท่ากันระหว่างดัชนีเหล่านี้ อุณหภูมิสามารถเป็นบวกและลบได้ ใช้อาร์เรย์แฮชสองตัว arr_1[size+1] สำหรับความถี่ของความแตกต่างเชิงบวก และ arr_2[size+1] สำหรับความถี่ของความแตกต่างเชิงลบ
สำหรับแต่ละความแตกต่าง temp<0 เพิ่มความถี่จาก arr_1[-temp] เพื่อนับ [ -(-temp) ] ให้ดัชนีบวก
สำหรับแต่ละความแตกต่าง temp> 0 เพิ่มความถี่จาก arr_2[temp] เพื่อนับ เนื่องจากค่าความแตกต่างเดียวกันที่เกิดขึ้นทั้งหมดจะเป็นส่วนหนึ่งของอาร์เรย์ย่อย อัปเดตความถี่เหล่านี้ทีละ 1
Arr[] = { 1,3,5,7,8,3,2 }
ค่าอุณหภูมิเริ่มต้นจาก 0 -
1,2,3,4,3,4,3 arr_1[] { 1,1,1,3,2,0,0,0 } //all differences are positive arr_2[] { 0,0,0,0,0,0,0,0 } //no difference is negative Adding arr_1[temp] to count in each iteration gives count=4.
อาร์เรย์ย่อยคือ − { 7,8 }, {8,3} {3,2}, {7,8,3,2}
-
ใช้อาร์เรย์เริ่มต้นเป็น arr[].
-
ฟังก์ชัน Sub_even_odd(int arr[], int size) ใช้อาร์เรย์และความยาวและส่งคืนจำนวนอาร์เรย์ย่อยที่มีองค์ประกอบคู่และคี่เหมือนกัน
-
ใช้การนับเริ่มต้นเป็น 0 และตัวแปร temp เป็นตัวแปรที่จะเพิ่มขึ้นเมื่อพบค่าคี่และลดค่าเมื่อพบค่าคู่
-
ใช้สองอาร์เรย์ arr_1[] และ arr_2[] เพื่อเก็บความถี่ของอุณหภูมิ arr_1[] สำหรับค่าบวกของ temp ซึ่งสามารถสูงถึง size+1 ในกรณีที่อาร์เรย์ทั้งหมดมีค่าเท่ากัน
arr_2[] สำหรับค่าลบของ temp ซึ่งสามารถสูงถึง size+1 ในกรณีที่อาร์เรย์ทั้งหมดมีค่าเท่ากัน
-
Traverse arr[] ใช้สำหรับวนซ้ำ
-
ถ้า arr[i] &1==1 แสดงว่า arr[i] เป็นเลขคี่ อุณหภูมิที่เพิ่มขึ้น ลดอุณหภูมิอย่างอื่น
-
หาก temp<0 ให้เพิ่มความถี่ที่สอดคล้องกันจาก arr_2[] เพื่อนับ เพิ่มความถี่นั้นขึ้น 1
-
หาก temp> 0 ให้เพิ่มความถี่ที่สอดคล้องกันจาก arr_1[] เพื่อนับ เพิ่มความถี่นั้นขึ้น 1
-
ในท้ายที่สุด เราได้นับเป็นจำนวนของอาร์เรย์ย่อยใน arr[] ที่มีจำนวนองค์ประกอบคู่และคี่เท่ากัน
-
ผลตอบแทนนับเป็นผลลัพธ์
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; int Sub_even_odd(int arr[], int size){ int count = 0; int temp = 0; int arr_1[size + 1] = {0}; int arr_2[size + 1] = {0}; arr_1[0] = 1; for (int i = 0; i < size; i++){ if(arr[i] & 1 == 1) { temp++; } else { temp--; } if (temp < 0){ count += arr_2[-temp]; arr_2[-temp]++; } else{ count += arr_1[temp]; arr_1[temp]++; } } return count; } int main(){ int arr[] = {3, 4, 6, 1, 2, 4, 10, 42}; int size = sizeof(arr) / sizeof(arr[0]); cout<<"Count of subarrays with same even and odd elements are: "<<Sub_even_odd(arr, size); return 0; }
ผลลัพธ์
หากเราเรียกใช้โค้ดข้างต้น มันจะสร้างผลลัพธ์ต่อไปนี้ -
Count of subarrays with same even and odd elements are: 4