找出陣列出現次數超過一半的數

2021-08-04 09:06:38 字數 1506 閱讀 4022

例如:

陣列中1出現了5次超過長度9的一半。因此輸出1;

:這裡沒有考慮出現次數最多的數字是0的情況,關鍵在於方法

這裡給出兩種常用方法:

這種演算法優點在於理解起來比較容易,如果乙個數出現次數超過長度的一半,那將陣列排序之後位於陣列中間位置的數一定就是要找到的數。

:需要檢測一下中間的數是否是超過一半的數,因為有可能出現次數最多的也不到一半,根據題目要求自己選擇是否需要

下面是**實現:

#include

using namespace std;

bool checkinvalidarray(int* numers, int

length);

int partition(int* numbers, int

length, int start, int end); //快速排序

int morethanhalfnum(int* numbers, int

length);

int randominrange(int min, int max)

void swap(int* num1, int* num2)

bool checkinvalidarray(int* numers, int

length)

bool checkmorethanhalf(int* numbers, int

length, int result)

if (times

*2<= length)

return false;

return true;

}int partition(int* numbers, int

length, int start, int end)

}++small;

swap(numbers[small], numbers[end]);

return small;

}int morethanhalfnum(int* numbers, int

length)

int result = numbers[middle];

if (!checkmorethanhalf(numbers, length, result))

result = 0;

return result;

}

優點:方法簡單,實現也很簡單

int morethanhalfnum2(int* numbers, int

length)

else

if(numbers[i] == result)

times++;

else

times--;

}if(!checkmorethanhalf(numbers, length,result))

result = 0;

return result;

}

找出陣列中出現次數超過一半的數

分析 最直接的方法,對陣列中所有的數排序,然後再掃瞄一遍,統計各個數出現的次數。如果某個數出現的次數超過一半,則輸出這個數。演算法的時間複雜度是o n log 2n n 如果每次刪除兩個不同的數,那麼,在剩下的數字裡,超過一半的數的個數一樣超過了50 不斷重複這個過程,最後剩下的即 為所求。無需避免...

演算法 找出陣列中出現次數超過一半的數

演算法 找出陣列中出現次數超過一半的數 每當我看到經典的演算法題,就懷念高中,感覺很多演算法題就是高中的題目,誰叫哥唯讀了個專科,高數基本相當沒學。有空要看看高數啊,想當年數學那是相當的.方法一 第乙個想到的方法是見乙個二維陣列,一維存陣列中的資料,二維存這個數出現的次數。出現次數最多的那個數就是要...

演算法 找出陣列中出現次數超過一半的數

演算法 找出陣列中出現次數超過一半的數 每當我看到經典的演算法題,就懷念高中,感覺很多演算法題就是高中的題目,誰叫哥唯讀了個專科,高數基本相當沒學。有空要看看高數啊,想當年數學那是相當的.include using namespace std class findtheone int b 2 new...