1. 程式人生 > 實用技巧 >摩爾投票法

摩爾投票法

在一個無序陣列中,存在一個數,它出現的次數大於陣列長度的一半。輸出這個數

一、排序、遍歷

二、摩爾投票法

摩爾投票演算法是一種使用線性時間和常數空間查詢大部分元素序列的演算法。

最簡單的形式就是,查詢輸入中重複出現超過一半以上(必須大於n/2,等於不算)的元素。如果序列中沒有這種元素,演算法不能檢測到正確結果,將輸出其中的一個元素之一。 如果不能保證輸入資料中有佔有一半以上的元素,需要再遍歷一下驗證。
滿足兩個先決條件

1、出現超過一半以上(n/2)的元素有且只有一個;

2、這個元素一定存在

演算法步驟

我們維護一個區域性變數作為當前查詢元素,一個區域性變數作為計數器,

當遍歷開始的時候,此時計數(count)為0,則將陣列第一個元素作為當前查詢元素;

當遍歷的元素與查詢元素相等,計數加1;反之則-1;

若當計數為0時,將下一個元素作為當前查詢元素,繼續重複以上操作;當遍歷結束時,當前查詢元素則為目標元素。

#include<iostream>
using namespace std;
int main() {
    
    int nums[100];
    int count = 1;
    int e = nums[0];
    int n, x;
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> nums[i];
    }
    
for (int i = 1; i < n; i++) { if (e == nums[i]) count++; else if (count != 0) { count--; } else if (count == 0) e = nums[i]; } cout << e << endl; system("pause"); return 0; }