ถ้าคุณเคยใช้ C++ คุณต้องรู้ว่า Subarrays คืออะไรและมีประโยชน์อย่างไร ตามที่เรารู้ว่าใน C++ เราสามารถแก้ปัญหาทางคณิตศาสตร์หลายอย่างได้ง่าย ในบทความนี้ เราจะอธิบายข้อมูลครบถ้วนเกี่ยวกับวิธีหา M odd numbers ด้วยความช่วยเหลือของ Subarrays ใน C++
ในปัญหานี้ เราต้องหาจำนวน Subarray ที่สร้างจากอาร์เรย์ที่กำหนดและจำนวนเต็ม m โดยที่แต่ละ Subarray ต้องมีเลขคี่ (Odd Numbers) อยู่ครบ m ตัว นี่คือตัวอย่างง่ายๆ สำหรับวิธีนี้
Input : array = { 6,3,5,8,9 }, m = 2 Output : 5 Explanation : Subarrays ที่มีเลขคี่ 2 ตัวคือ { 3,5 }, { 6,3,5 }, { 3,5,8 }, { 5,8,9 }, { 6,3,5,8 }, { 3,5,8,9 }
Input : array = { 1,6,3,2,5,4 }, m = 2 Output : 6 Explanation : Subarrays ที่มีเลขคี่ 2 ตัวคือ { 1,6,3 }, { 3,2,5 }, { 1,6,3,2 }, { 6,3,2,5 }, { 3,2,5,4 }, { 6,3,2,5,4 }
วิธีแรก (First Approach)
ในวิธีนี้ สร้าง Subarray ทั้งหมดที่เป็นไปได้จากอาร์เรย์ที่กำหนด และตรวจสอบแต่ละ Subarray ว่ามีเลขคี่ m ตัวพอดีหรือไม่ เป็นวิธี Generate และ Find แบบง่าย ความซับซ้อน O(n²)
ตัวอย่าง
#include <bits/stdc++.h>
using namespace std;
int main (){
int a[] = { 1, 6, 3, 2, 5, 4 };
int n = 6, m = 2, count = 0;
for (int i = 0; i < n; i++){
int odd = 0;
for (int j = i; j < n; j++) {
if (a[j] % 2) odd++;
if (odd == m) count++;
}
}
cout << "Number of subarrays with n numbers are: " << count;
return 0;
}
ผลลัพธ์
Number of subarrays with n numbers are: 6
คำอธิบายโค้ด
ในโค้ดนี้ เราใช้ Nested Loops หา Subarray ที่มีเลขคี่ m ตัว ลูปนอกใช้เพิ่ม "i" ซึ่งใช้ประมวลผลแต่ละสมาชิกในอาร์เรย์ ลูปในใช้หา Subarray และประมวลผลสมาชิกจนตัวนับคี่ถึง m เพิ่มตัวนับผลลัพธ์ count สำหรับแต่ละ Subarray ที่พบ และสุดท้ายพิมพ์ผลลัพธ์ที่เก็บในตัวแปร count
วิธีที่สอง (Second Approach)
วิธีอื่นคือสร้างอาร์เรย์สำหรับเก็บจำนวน Prefix ที่มี "i" เลขคี่ ประมวลผลทุกสมาชิก และเพิ่มจำนวนเลขคี่สำหรับทุกเลขคี่ที่พบ
เมื่อจำนวนเลขคี่เกินหรือเท่ากับ m ให้บวกจำนวนที่ตำแหน่ง (odd - m) ใน Prefix Array
เมื่อ odd มากกว่าหรือเท่ากับ m เราคำนวณจำนวน Subarray ที่สร้างได้จนถึงดัชนี และตัวเลข "odd - m" จะถูกบวกเข้า Count Variable ผลลัพธ์เก็บในตัวแปร Count หลังประมวลผลทุกสมาชิก
ตัวอย่าง
#include <bits/stdc++.h>
using namespace std;
int main (){
int array[ ] = { 1, 6, 3, 2, 5, 4 };
int n = 6, m = 2, count = 0, odd = 0, i;
int prefix_array[n + 1] = { 0 };
for (i = 0; i < n; i++){
prefix_array[odd] = prefix_array[odd] + 1;
if (array[i] % 2 == 0) odd++;
if (odd >= m) count += prefix_array[odd - m];
}
cout << "Number of subarrays with n numbers are: " << count;
return 0;
}
ผลลัพธ์
Number of subarrays with n numbers are: 6
คำอธิบายโค้ด
การเริ่มต้นตัวแปรและอาร์เรย์ด้วยค่าเริ่มต้น
int array[ 6 ] = { 1, 6, 3, 2, 5, 4 }; int n = 6, m = 2, count = 0, odd = 0, i; int prefix_array[n + 1] = { 0 };
ในนี้ เราเริ่มต้นตัวแปร n ด้วยขนาดอาร์เรย์ m ด้วยจำนวนเลขคี่ที่ต้องหา count ด้วย 0 เพื่อนับ Subarray ที่เป็นไปได้ odd ด้วย 0 และ prefix_array ขนาด n+1 ด้วย 0
การเข้าใจลูป
for (i = 0; i < n; i++){ prefix_array[odd] = prefix_array[odd] + 1; if (array[i] % 2 == 0) odd++; if (odd >= m) count += prefix_array[odd - m]; }
ในลูปนี้ เรากำหนดค่าที่ดัชนี odd ใน prefix_array[] แล้วเพิ่มตัวแปร odd ถ้าพบเลขคี่ เราหาจำนวน Subarray ที่สร้างได้จนถึงดัชนี เมื่อตัวแปร odd เท่ากับหรือมากกว่า m
สุดท้าย เราพิมพ์จำนวน Subarray ที่มีเลขคี่ m ตัว ที่เก็บในตัวแปร count และได้ผลลัพธ์
สรุป
ในบทความนี้ เราเข้าใจวิธีการหาจำนวน Subarray ที่มีเลขคี่ m ตัว จากสองวิธี
- สร้างทุก Subarray และตรวจสอบเลขคี่ m ตัว เพิ่ม Count สำหรับแต่ละ Subarray ที่พบ Time Complexity O(n²)
- วิธีมีประสิทธิภาพ คือไปผ่านแต่ละสมาชิกของอาร์เรย์ สร้าง Prefix Array และหาผลลัพธ์ด้วยความช่วยเหลือของ Prefix Array Time Complexity O(n)
หวังว่าบทความนี้จะช่วยให้เข้าใจปัญหาและวิธีแก้