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

題目描述

數組中有一個數字出現的次數超過數組長度的一半,請找出這個數字。例如輸入一個長度爲9的數組{1,2,3,2,2,2,5,4,2}。由於數字2在數組中出現了5次,超過數組長度的一半,因此輸出2。如果不存在則輸出0。

思路詳解

思路1---尋找中位數(會改變原數組的順序)

1. 先整體排序,找到中位數

(1)先對數組進行排序,如果某個數字m的出現次數超過數組長度的一半,那麼排序之後的數組的中間元素一定是該數字m

(2)獲得排序之後的數組的中間元素value = numbers[size/2]

(3)統計該數字出現的次數是否大於數組長度的一半

爲了減少遍歷次數,可以從中間向兩邊遍歷,計數value出現的次數

class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers) {
        int s = numbers.size();
        if(s == 0)
            return 0;
        sort(numbers.begin(), numbers.end());
        int value = numbers[s / 2];
        int cnt = 0;
        int i = 0;
        for(i = 0; i < s; i++)
        {
            if(numbers[i] == value)
                break;
        }
        while(i < s)
        {
            if(numbers[i] != value)
                break;
            cnt++;
            i++;
        }
        if(cnt > (s/2))
            return value;
        else
            return 0;
    }
};

2. 利用快速排序思想找到中位數

(會改變原數組的順序)

---尋找數組的中位數

出現次數超過數組長度的一半的數字一定是數組的中位數,利用快速排序的思想:

(1)在數組中隨機找一個數,將小於它的數放在他的左邊,大於它的數放在他的右邊

(2)如果這個數的下標剛好是size/2,那麼他就是數組的中位數

(3)否則,如果他的下標<size/2,中位數在它的右邊,>size/2中位數在它的左邊

(4)遞歸在它的左邊或右邊部分進行查找

---判斷中位數的出現次數是否大於數組長度的一半

遍歷一遍數組,統計中位數的出現次數,判斷是否超過長度的一半

 

思路2--- 數組的特點之次數和

(不改變原數組的順序) 

出現次數超過數組長度的一半,說明它出現的次數比數組中所有元素出現的次數和還要多

因此可以在遍歷的時候保存兩個值,一個是數組中的數字value,一個是次數

(1)與前一個數字相同時,times++

(2)與前一個數字不同時,times--

(3)當times爲0時,value重新賦值爲當前的元素,並將times設置爲1

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章