天天看點

[劍指offer] 數組中出現次數超過一半的數字

本文首發于我的個人部落格: 尾尾部落

題目描述

數組中有一個數字出現的次數超過數組長度的一半,請找出這個數字。例如輸入一個長度為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;
    }
}