題目描述如果用暴力搜尋,那就太沒意思了,所有的問題都可以用列舉法解決。陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為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查詢是...