29. 數組中出現次數超過一半的數字

  題目:數組中有一個數字出現的次數超過數組長度的一半,請找出這個數字。例如輸入一個長度爲9的數組{1,2,3,2,2,2,,5,4,2}.因爲數字2在數組中出現了5次,超過數組長度的一半,所以輸出2。ios


  思路:從第一個數開始,出現次數設爲1,若是下一個數等於當前這個數,則加1,不等則減1,當次數值爲0時,保存下一個值,且設次數值爲1,繼續遍歷。由於這個數出現了超過一半的次數,因此咱們找出最後一個將初始值設爲1的值便可。數組

#include<iostream>
using namespace std;

//檢查數組是否有效
bool arrayInvalid = false;

bool CheckInvalidArray(int* numbers, int length)
{
    arrayInvalid = false;

    if (numbers == NULL || length < 0)
    {
        arrayInvalid = true;
    }

    return arrayInvalid;

}

//判斷該數組出現頻率最大的那個數有沒有超過一半
bool CheckMoreThanHalf(int* numbers, int length, int number)
{
    int times = 0;

    for (int i = 0; i < length; ++i)
    {
        if (numbers[i] == number)
        {
            times++;
        }
    }

    bool isMoreThanHalf = true;
    if (times * 2 <= length)
    {
        arrayInvalid = true;
        isMoreThanHalf = false;
    }

    return isMoreThanHalf;
}

//找出這個數
int MoreThanHalfNum(int* numbers, int length)
{
    if (CheckInvalidArray(numbers, length))
    {
        return 0;
    }

    int result = numbers[0];
    int times = 1;

    for (int i = 1; i < length; i++)
    {
        if (times == 0)
        {
            result = numbers[i];
            times = 1;
        }
        else if (numbers[i] == result)
        {
            times++;
        }
        else
        {
            times--;
        }
    }

    if (!CheckMoreThanHalf(numbers, length, result))
    {
        result = 0;
    }

    return result;
}

int main()
{
    int a[7] = {1,2,2,4,2,2,3};

    int b = MoreThanHalfNum((int*)a, 7);

    cout << b << endl;

}
相關文章
相關標籤/搜索