本文首發于我的個人部落格: 尾尾部落
題目描述
數組中有一個數字出現的次數超過數組長度的一半,請找出這個數字。例如輸入一個長度為9的數組{1,2,3,2,2,2,5,4,2}。由于數字2在數組中出現了5次,超過數組長度的一半,是以輸出2。如果不存在則輸出0。
解題思路
三種解法:
- 法1:借助hashmap存儲數組中每個數出現的次數,最後看是否有數字出現次數超過數組長度的一半;
- 法2:排序。數組排序後,如果某個數字出現次數超過數組的長度的一半,則一定會數組中間的位置。是以我們取出排序後中間位置的數,統計一下它的出現次數是否大于數組長度的一半;
- 法3:某個數字出現的次數大于數組長度的一半,意思就是它出現的次數比其他所有數字出現的次數和還要多。是以我們可以在周遊數組的時候記錄兩個值:1. 數組中的數字;2. 次數。周遊下一個數字時,若它與之前儲存的數字相同,則次數加1,否則次數減1;若次數為0,則儲存下一個數字,并将次數置為1。周遊結束後,所儲存的數字即為所求。最後再判斷它是否符合條件。
參考代碼
法1:
import java.util.HashMap;
import java.util.Map;
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
int length = array.length;
for(int i=0; i<length; i++){
if(!map.containsKey(array[i]))
map.put(array[i], 1);
else
map.put(array[i], map.get(array[i])+1);
}
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
if(entry.getValue()*2>length)
return entry.getKey();
}
return 0;
}
}
法2:
import java.util.Arrays;
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
Arrays.sort(array);
int half = array.length/2;
int count = 0;
for(int i=0; i<array.length; i++){
if(array[i] == array[half])
count ++;
}
if(count > half)
return array[half];
else
return 0;
}
}
法3:
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
int res = array[0], count = 1;
for(int i=1; i<array.length; i++){
if(array[i] == res)
count++;
else{
count--;
}
if(count == 0){
res = array[i];
count = 1;
}
}
count = 0;
for(int i=0; i<array.length; i++){
if(array[i] == res)
count++;
}
return count > array.length/2 ? res : 0;
}
}