1. 程式人生 > >牛客網--陣列中出現次數超過一半的數字

牛客網--陣列中出現次數超過一半的數字

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

這道題我記得可以用某種O(n)方法很巧妙,但是忘了,只好用笨的方法

package 劍指offer;

import java.util.HashMap;

/**
 * Created by Administrator on 2018/10/12.
 */
public class 陣列中出現次數超過一半的數字 {
    public int MoreThanHalfNum_Solution(int [] array) {
        HashMap<Integer,Integer> map=new HashMap<>();
        for(int i=0;i<array.length;i++){
            if(map.getOrDefault(array[i],0)+1>array.length/2){
                return array[i];
            }else{
                map.put(array[i],map.getOrDefault(array[i],0)+1);
            }
        }
        return 0;
    }
}

貼一下別人的程式碼,主要是利用結果數字超過陣列長度一半的特點,儲存兩個值,即一個是陣列中的一個數字,一個是次數 當我們遍歷到下一個數字的時候,

如果下一個數字和當前我們儲存的數字相同,則次數加 1;

如果和當前我們儲存的數字不同,則次數減 1;

當次數減到 0 的時候,我們將儲存的數字改為當前遍歷所處的位置,並將次數更改為 1。

int MoreThanHalfNum(int *arr, int len)
{
    int result = arr[0];
    int count = 1;

    for(int i = 1; i < len; ++i)
    {
        if(arr[i] == result)
            count ++;
        else if(count == 0)
        {
            result = arr[i];
            count = 1;
        }
        else
            count --;
    }
    return result;
}

int main(int argc, char *argv[])
{
    int arr[5] = {1, 0, 1, 2, 1};

    int num = MoreThanHalfNum(arr, 5);
    printf("The num is: %d\n", num);

    return 0;
}