找出陣列中出現一半以上次數的數字

2021-07-30 06:34:11 字數 812 閱讀 1323

網上有很多關於這題的解析,目前我看到最有的解法就是計數刪除法,但**很抽象,比較難理解,下面我談談自己理解,主要是為了加深印象。

public int morethanhalfnum_solution(int  array)

計數刪除法的核心是每次刪除陣列中不同的兩個數,則陣列剩下的元素中原先佔據一半以上的元素不會改變,當最後只剩下乙個元素的時候,就是我們想要的結果。

我們用陣列舉例說明。首先我們定義 count = 1, res = array[0] = 1, 可以認為它表示當前待刪除元素是 res= 1, 且數量是1; 接著繼續遍歷陣列,此時count = 1, 我們需要比較下乙個元素array[1] 和res 是否相等,相等的情況下,count ++,count = 2, 意味著待刪除元素res存在兩個,繼續遍歷下乙個元素; 不相等的話,意味著我們找到了要刪除的另外乙個元素,此時 count--,  顯然,屬於第二種情況,我們刪除了兩個元素,此時 count = 0; 

陣列遍歷到第三個元素,此時count ==0 ,表示待刪除元素個數為 0 ,所以無論如何,都要把當前元素標記為待刪除元素 res= arr[2] , count  = 1;

以此類推直至遍歷結束,res 就是我們想要的結果。

過程中最重要的是對 count 的理解,它表示的是當前待刪元素的個數,count==0時意味著待刪除元素個數為0,所以下乙個元素一定要標記為待刪除元素,且令 count = 1;     count!=0 時,我們需要判斷下乙個元素是否與待刪除元素相同,相同的話,count++; 不同時表示我們找到了另外乙個單刪除的元素,此時可以進行刪除, count--; 

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

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

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

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

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

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