《劍指offer》 陣列中出現次數超過一半的數字

2021-07-08 10:05:17 字數 3248 閱讀 9932

題目描述

陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。

如果用暴力搜尋,那就太沒意思了,所有的問題都可以用列舉法解決。

把當前array陣列的第0號元素,即array[0],與後面的作比較,如果相等,計數器count ++;否則,就把不同的元素放在乙個新陣列temparray中,等這一輪遍歷完之後:

比較count 與 array.length/2的大小,如果前者大於後者,直接返回array[0]元素;

即使前者不大於後者,說明這個array[0]不是要尋找的目標元素,此時,記下共有多少與array[0]不同的元素存在(這些元素都在新陣列temparray中),標記為newlength,把temparray中的元素覆蓋在array陣列上,繼續以上操作;

繼續以上操作的情況分為兩種,一種是array陣列中根本就不存在目標元素,此時,有newlength = 0;如果存在,就會從while迴圈的判斷條件跳出。

code:

/**

* t: 陣列中出現次數超過一半的數字

* * 題目描述

* 陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。

* 例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5次,

* 超過陣列長度的一半,因此輸出2。如果不存在則輸出0。

* * date: 2015.11.27

* @author sss

* */

public

class

solution

int targetnum =0;

int newlength = array.length;

int[

]temparray =

newint

[array.length]

;// 統計每個數字在陣列中的個數

int count =0;

int curnum = array[0]

;while

(count <= array.length /2)

int k =0;

count =0;

//每次都用array陣列的第0號元素與後面的相比,把不同的元素放在新陣列temparray中

for(

int i =

0; i < newlength; i++

)else

} curnum = array[0]

; newlength = k;

for(

int i =

0; i < newlength; i++)}

// 這種情況下,不是經由while退出的,而是因為找不到此類元素而退出的,要返回0

if(count <= array.length /2)

else

return targetnum;

}}

首先看乙個規律:

給定乙個陣列:arr

ay=[

a(1)

,...

,a(j

),a(

j+1)

,...

,a(n

)]array = [a(1), ... , a(j) , a(j+1), ... , a(n)]

array=

[a(1

),..

.,a(

j),a

(j+1

),..

.,a(

n)]

將陣列分為兩部分: [a(

1),.

..,a

(j)]

[a(1), ... , a(j)]

[a(1),

...,

a(j)

] 和 [a(

j+1)

,...

,a(n

)][a(j+1), ... , a(n)]

[a(j+1

),..

.,a(

n)]設想:如果在 [a(

1),.

..,a

(j)]

[a(1), ... , a(j)]

[a(1),

...,

a(j)

] 部分中,如果某個元素正好只佔一半,單考慮這部分陣列,該元素是不會成為目標元素的,那麼可以繼續尋找下一部分陣列中能超過一半的元素。

而本**的思想也是如此,設定初始元素,看其在一部分陣列中占有的比例,當比例達到一半時,就拋棄,相當於前半部分不曾有過,把下乙個元素設定為主對比元素,重複此步驟。

以上講解也說不清楚,看**,比較簡單:

code:

/**

* t: 陣列中出現次數超過一半的數字

* * 題目描述

* 陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。

* 例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5次,

* 超過陣列長度的一半,因此輸出2。如果不存在則輸出0。

* * date: 2015.11.27 18:49

* @author sss

* */

public

class

solution

//當前num元素的計數

int count =1;

int num = array[0]

;for

(int i =

1; i < array.length; i++

)else

// 小於零,則說明array[i]之前的元素中,沒有乙個元素的個數超過了半數,

// 頂多是一半,或者更少,這個時候就要從後面的元素重新開始找

劍指offer 陣列在排序陣列中出現的次數

記錄次數,直接用data.count k 也通過了。或者常規演算法,出現有序用二分查詢。class solution def getnumberofk self,data,k write code here if len data 0 return 0 count 0 low 0 high len ...

劍指offer第39 陣列中出現次數超過一半的數字

陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。coding utf 8 classsolution defmorethanhalfnum solution self numb...

劍指Offer 028陣列中出現次數超過一半的陣列

028陣列 現次數超過一半的陣列 題目 陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列 現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0 方法 map統計法 思路 遍歷陣列,用map來記錄每個數出現的次數,最後再遍歷map查詢是...