ที่นี่เราจะดูปัญหาหนึ่ง สมมติมีอาร์เรย์หนึ่ง มี n องค์ประกอบ เราต้องหาดัชนีหนึ่ง ที่ความถี่ของเลขคู่ทางซ้าย และความถี่ของเลขคู่ทางขวาเท่ากัน หรือความถี่ของเลขคี่ทางซ้ายเท่ากับความถี่ของเลขคี่ทางขวา หากไม่มีผลลัพธ์ ให้ส่งคืน -1
สมมติอาร์เรย์เป็น {4, 3, 2, 1, 2, 4} ผลลัพธ์คือ 2 องค์ประกอบที่ดัชนี 2 คือ 2 มีเลขคี่เพียง 1 ตัวทางซ้าย และทางขวาก็มีเลขคี่เพียง 1 ตัว
เพื่อแก้ปัญหานี้ เราจะสร้างสองเวกเตอร์ของคู่ (pairs) เพื่อเก็บข้อมูลซ้ายและขวา เวกเตอร์ซ้ายจะเก็บความถี่ของเลขคี่และคู่ทางซ้าย และเวกเตอร์ขวาทำอย่างเดียวกันสำหรับขวา หากจำนวนคู่ซ้าย-ขวาหรือจำนวนคี่ซ้าย-ขวาเท่ากัน ให้ส่งคืนดัชนีนั้น
อัลกอริทึม
getIndex(arr, n):
Begin
กำหนด odd และ even เริ่มต้นเป็น 0
กำหนด left_vector, right_vector สำหรับคู่ odd-even
เพิ่ม (odd, even) เข้า left_vector
for i ในช่วง 0 ถึง n-1:
ถ้า arr[i] เป็นเลขคู่ เพิ่ม even มิฉะนั้นเพิ่ม odd
เพิ่ม (odd, even) เข้า left_vector
done
odd := 0 และ even := 0
เพิ่ม (odd, even) เข้า right_vector
for i ในช่วง n-1 ลงถึง 1:
ถ้า arr[i] เป็นเลขคู่ เพิ่ม even มิฉะนั้นเพิ่ม odd
เพิ่ม (odd, even) เข้า right_vector
done
reverse right_vector
for แต่ละองค์ประกอบที่ดัชนี i ใน left_vector:
ถ้า left_vector[i].first == right_vector[i].first หรือ left_vector[i].second == right_vector[i].second ส่งคืน i
done
ส่งคืน -1
End
ตัวอย่างโค้ด
#include <iostream>
#include <vector>
#include <utility>
#include <algorithm>
using namespace std;
int getIndex(int n, int arr[]) {
int odd = 0, even = 0;
vector<pair<int, int>> left_vector, right_vector;
left_vector.push_back(make_pair(odd, even));
for (int i = 0; i < n - 1; i++) {
if (arr[i] % 2 == 0)
even++;
else
odd++;
left_vector.push_back(make_pair(odd, even));
}
odd = 0, even = 0;
right_vector.push_back(make_pair(odd, even));
for (int i = n - 1; i > 0; i--) {
if (arr[i] % 2 == 0)
even++;
else
odd++;
right_vector.push_back(make_pair(odd, even));
}
reverse(right_vector.begin(), right_vector.end());
for (int i = 0; i < left_vector.size(); i++) {
if (left_vector[i].first == right_vector[i].first ||
left_vector[i].second == right_vector[i].second)
return i;
}
return -1;
}
int main() {
int arr[] = {4, 3, 2, 1, 2};
int n = sizeof(arr) / sizeof(arr[0]);
int index = getIndex(n, arr);
if (index == -1) {
cout << "-1";
} else {
cout << "index: " << index;
}
}
ผลลัพธ์
index: 2