演算法之尋找陣列中的多數元素

2021-10-23 16:18:06 字數 3011 閱讀 9072

給定乙個大小為 n 的陣列,找到其中的多數元素。多數元素是指在陣列**現次數大於 ⌊ n/2 ⌋ 的元素。

你可以假設陣列是非空的,並且給定的陣列總是存在多數元素。

首先,我們先按照一般思路想。可以新定義乙個陣列來儲存原始陣列中每個不同元素出現的個數,然後定義兩個變數來儲存當前最大出現的次數和當前的多數元素。

private

double

findnum

(double

originarr)}}

}return maxvalue;

}

簡單解釋下這個函式,首先我們這個函式接收原始的陣列,然後新定義乙個整型陣列。新陣列的最大長度最多也就是原始陣列每個元素都不同的情況,不過根據題中描述,多數元素一定存在,那麼理論上這個陣列的最大長度也就是n/2。簡單解釋下,長度為n陣列多數元素必定佔n/2+1以上個,其它元素即使都不同最多也就佔n/2-1個,加上那個多數元素最長為n/2即可。不過這裡我們並不能這樣定義,往後看即知。

maxcount變數代表陣列中元素最大出現的次數,初始值為1,maxvalue變數代表陣列中的多數元素。

這裡有個細節,由於存放元素出現次數的陣列與原始陣列唯一的對應關係就是下標,所以我們存的某乙個元素的出現次數在temparr裡是不連續的。比如原始陣列為1,1,2,2,2,那麼當這段程式執行後,temparr[0]的值為2,代表1出現了兩次,temparr[1]的值為原始值1,temparr[2]的值為3,代表2出現了3次,temparr[3]、temparr[4]的值都為原始值1。這也是為什麼不能把temparr陣列長度定義為n/2的原因。

這裡我們新建乙個wpf程式,然後在mainwindow.xaml裡簡單布下局,乙個文字框用於輸入內容,乙個按鈕用來給尋找多數元素的函式創造呼叫時機,多數元素通過後台呼叫彈窗顯示即可。

布局**:

<

window x:class=

"findmostelement.mainwindow"

xmlns=

""xmlns:x=

""xmlns:d=

""xmlns:mc=

""xmlns:local=

"clr-namespace:findmostelement"

mc:ignorable=

"d" title=

"mainwindow" height=

"450" width=

"800"

>

<

stackpanel horizontalalignment=

"center" verticalalignment=

"center" orientation=

"horizontal"

>

<

textbox x:name=

"txt_arr" width=

"200" height=

"wrap" verticalscrollbarvisibility=

"auto"

>

<

/textbox>

<

button x:name=

"btn_start" margin=

"10,0,0,0" width=

"80" height=

"30" click=

"btn_start_click"

>開始<

/button>

<

/stackpanel>

<

/grid>

<

/window>

我們這裡把mainwindow.xaml.cs的**也一起貼出來,方便讀者自行去驗證~

using system;

using system.windows;

namespace findmostelement

private

void

btn_start_click

(object sender,

routedeventargs e)

}catch

(exception ex)

double mostvalue =

findnum

(originarr)

; messagebox.

show

("該陣列中的多數元素為:"

+ mostvalue +

"。",

"資訊"

, messageboxbutton.ok, messageboximage.information);}

private

double

findnum

(double

originarr)}}

}return maxvalue;}}

}

到這裡,我們的一般處理相當於完成了。這時我們應該會想到,既然是演算法題,那麼理論上必定會有更優的解法。我們可以這樣想,對於用程式做一件事情來說,我們要著重關注起始條件和最終要出的結果,要善於發現起始條件中隱含的資訊。拿此題來講,我們的起始條件是乙個必定存在多數元素的陣列,然後要的結果就是輸出多數元素。我們如果想要更優,那麼就需要去掉剛才那個方法的一些過程,比如記錄每個元素出現次數的陣列,記錄當前最大出現次數和當前多數元素值的變數。

好了,話不多說,更優的乙個解法如下。首先我們假定多數元素為原始陣列第乙個元素,定義變數mostvalue,然後我們遍歷陣列,遇到和假定的元素一樣的就+1,不一樣的就-1,最後結果必然是乙個大於0的值。然後我們用乙個中間變數cursum來表示當前總和,每次當cursum等於0時,把當前遍歷到的陣列元素值賦給mostvalue,當遍歷結束後,mostvalue就是我們要找的多數元素值。

private

double

fastfindnum

(double

originarr)

return mostvalue;

}

理解後,建議大家自行去驗證其正確性。

python尋找多數元素 尋找多數元素 演算法

定義 整型陣列a 1.n 如果整數x在陣列a 現的次數多於半數,則x稱為多數元素 應用概念 觀察結論5.1 在原序列中去除兩個不同的元素後,那麼在原序列中的多數元素在新序列中還是多數元素。例1 1,2,2,3,2,2,3 顯然2是多數元素 去除1,2,在2,3,2,2,3中2仍是多數元素 去除1,3...

演算法之道 尋找多數元素演算法(Java)

定義 整型陣列a 1.n 如果整數x在陣列a中出現的次數多於半數,則x稱為多數元素 應用概念 觀察結論5.1 在原序列中去除兩個不同的元素後,那麼在原序列中的多數元素在新序列中還是多數元素。例1 1,2,2,3,2,2,3 顯然2是多數元素 去除1,2,在2,3,2,2,3中2仍是多數元素 去除1,...

尋找陣列中的主要元素

對於乙個大小為n的整數陣列,將其中出現次數大於n 2的元素稱為主要元素,例如中主要元素是5,而中則沒有。似乎是乙個統計陣列元素出現次數的問題,因此尋找出現次數最多的元素的解法在這裡也適用。不過該問題有乙個特點 即要求元素出現次數過半。因此,如果存在這樣的主要元素x,將它與陣列所有元素進行比較,相等則...