From 66dd7e9802cbbf4ace922d0ede7f29c712e8954e Mon Sep 17 00:00:00 2001 From: Adam Djellouli <37275728+djeada@users.noreply.github.com> Date: Thu, 18 Sep 2025 14:27:50 +0200 Subject: [PATCH 1/4] Update majority_element.cpp --- src/1_Arrays/majority_element.cpp | 90 +++++++------------------------ 1 file changed, 18 insertions(+), 72 deletions(-) diff --git a/src/1_Arrays/majority_element.cpp b/src/1_Arrays/majority_element.cpp index 40f5ce9..2202667 100644 --- a/src/1_Arrays/majority_element.cpp +++ b/src/1_Arrays/majority_element.cpp @@ -3,22 +3,16 @@ * * A majority element is an element that appears more than n/2 times in an array * of size n. If such an element exists, return it; otherwise, indicate no majority. - * - * Example: - * Input: [2, 2, 2, 1, 1] - * Output: 2 - * - * Input: [1, 2, 3, 4, 5] - * Output: No majority */ #include #include #include -#include #include #include +#include #include +// ---- Utility ---- bool isMajority(const std::vector& arr, int candidate) { return std::count(arr.begin(), arr.end(), candidate) * 2 > static_cast(arr.size()); } @@ -42,43 +36,19 @@ int majorityCounting(const std::vector& arr) { return candidate; } -// Quickselect-based partition (average O(n), modifies array) -int randomIndex(int start, int end) { - static std::mt19937 gen{std::random_device{}()}; - std::uniform_int_distribution<> dist(start, end); - return dist(gen); -} - -int partition(std::vector& arr, int start, int end) { - int pivotIdx = randomIndex(start, end); - std::swap(arr[pivotIdx], arr[end]); - int store = start; - for (int i = start; i < end; ++i) { - if (arr[i] < arr[end]) { - std::swap(arr[i], arr[store++]); - } - } - std::swap(arr[store], arr[end]); - return store; -} - -int majorityPartition(std::vector& arr) { +// Frequency dictionary approach (O(n) time, O(n) space) +int majorityFrequency(const std::vector& arr) { if (arr.empty()) throw std::invalid_argument("Array is empty."); - int mid = arr.size() / 2, lo = 0, hi = arr.size() - 1; - while (true) { - int idx = partition(arr, lo, hi); - if (idx == mid) break; - if (idx < mid) lo = idx + 1; - else hi = idx - 1; + std::unordered_map freq; + for (int v : arr) { + if (++freq[v] > static_cast(arr.size()) / 2) { + return v; // early exit + } } - int candidate = arr[mid]; - if (!isMajority(arr, candidate)) - throw std::invalid_argument("No majority exists."); - return candidate; + throw std::invalid_argument("No majority exists."); } // ---- Testing infrastructure ---- - struct TestCase { std::string name; std::vector arr; @@ -86,50 +56,26 @@ struct TestCase { int expected; // only meaningful if expectException == false }; -void testMajorityCounting(const std::vector& cases) { - std::cout << "=== Testing majorityCounting ===\n"; - for (auto& tc : cases) { - bool passed = false; - try { - int result = majorityCounting(tc.arr); - if (!tc.expectException && result == tc.expected) { - passed = true; - } - } catch (const std::invalid_argument&) { - if (tc.expectException) passed = true; - } - std::cout - << tc.name - << " -> " << (passed ? "PASS" : "FAIL") - << "\n"; - assert(passed); - } - std::cout << "\n"; -} - -void testMajorityPartition(const std::vector& cases) { - std::cout << "=== Testing majorityPartition ===\n"; +// Generic runner +template +void runTests(const std::string& title, const std::vector& cases, Func func) { + std::cout << "=== " << title << " ===\n"; for (auto& tc : cases) { bool passed = false; try { - auto copy = tc.arr; // partition modifies in-place - int result = majorityPartition(copy); + int result = func(tc.arr); if (!tc.expectException && result == tc.expected) { passed = true; } } catch (const std::invalid_argument&) { if (tc.expectException) passed = true; } - std::cout - << tc.name - << " -> " << (passed ? "PASS" : "FAIL") - << "\n"; + std::cout << tc.name << " -> " << (passed ? "PASS" : "FAIL") << "\n"; assert(passed); } std::cout << "\n"; } - int main() { std::vector cases = { { "No majority", {1,2,3,4,5}, true, 0 }, @@ -151,8 +97,8 @@ int main() { }(), false, 1 } }; - testMajorityCounting(cases); - testMajorityPartition(cases); + runTests("Testing majorityCounting (Boyer–Moore)", cases, majorityCounting); + runTests("Testing majorityFrequency (Hash Map)", cases, majorityFrequency); std::cout << "All tests passed successfully!\n"; return 0; From 12ee5d90f8155c1e183cd1108c48806f601876f1 Mon Sep 17 00:00:00 2001 From: Adam Djellouli <37275728+djeada@users.noreply.github.com> Date: Thu, 18 Sep 2025 14:35:55 +0200 Subject: [PATCH 2/4] Update src/1_Arrays/majority_element.cpp Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/1_Arrays/majority_element.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/1_Arrays/majority_element.cpp b/src/1_Arrays/majority_element.cpp index 2202667..b25381c 100644 --- a/src/1_Arrays/majority_element.cpp +++ b/src/1_Arrays/majority_element.cpp @@ -41,7 +41,7 @@ int majorityFrequency(const std::vector& arr) { if (arr.empty()) throw std::invalid_argument("Array is empty."); std::unordered_map freq; for (int v : arr) { - if (++freq[v] > static_cast(arr.size()) / 2) { + if (freq[v] * 2 > static_cast(arr.size())) { return v; // early exit } } From 4a67ed9ff9c11cbed99d2c6b4086139201fe8f6a Mon Sep 17 00:00:00 2001 From: Adam Djellouli <37275728+djeada@users.noreply.github.com> Date: Thu, 18 Sep 2025 14:36:02 +0200 Subject: [PATCH 3/4] Update src/1_Arrays/majority_element.cpp Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/1_Arrays/majority_element.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/1_Arrays/majority_element.cpp b/src/1_Arrays/majority_element.cpp index b25381c..75d0d7a 100644 --- a/src/1_Arrays/majority_element.cpp +++ b/src/1_Arrays/majority_element.cpp @@ -36,7 +36,7 @@ int majorityCounting(const std::vector& arr) { return candidate; } -// Frequency dictionary approach (O(n) time, O(n) space) +// Finds and returns the majority element using the frequency dictionary approach (O(n) time, O(n) space). int majorityFrequency(const std::vector& arr) { if (arr.empty()) throw std::invalid_argument("Array is empty."); std::unordered_map freq; From e6a4dc7da7dae91bf72909d50ace2269c4a58913 Mon Sep 17 00:00:00 2001 From: Adam Djellouli <37275728+djeada@users.noreply.github.com> Date: Thu, 18 Sep 2025 14:42:00 +0200 Subject: [PATCH 4/4] Refactor majorityFrequency for improved clarity --- src/1_Arrays/majority_element.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/1_Arrays/majority_element.cpp b/src/1_Arrays/majority_element.cpp index 75d0d7a..bf95edd 100644 --- a/src/1_Arrays/majority_element.cpp +++ b/src/1_Arrays/majority_element.cpp @@ -40,14 +40,15 @@ int majorityCounting(const std::vector& arr) { int majorityFrequency(const std::vector& arr) { if (arr.empty()) throw std::invalid_argument("Array is empty."); std::unordered_map freq; + const int n = static_cast(arr.size()); for (int v : arr) { - if (freq[v] * 2 > static_cast(arr.size())) { - return v; // early exit - } + int c = ++freq[v]; // increment the count for v + if (c * 2 > n) return v; // early exit if v is majority } throw std::invalid_argument("No majority exists."); } + // ---- Testing infrastructure ---- struct TestCase { std::string name;