1. 程式人生 > >劍指offer28 陣列中出現次數超過一半的數字(java)

劍指offer28 陣列中出現次數超過一半的數字(java)

題目

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

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

思路

思路一(程式碼略)

先排序,然後找中位數

思路二

由於該數字的出現次數比所有其他數字出現次數的和還要多,因此可以考慮在遍歷陣列時儲存兩個值:一個是陣列中的一個數字,一個是次數。當遍歷到下一個數字時,如果下一個數字與之前儲存的數字相同,則次數加1,如果不同,則次數減1,如果次數為0,則需要儲存下一個數字,並把次數設定為1。由於我們要找的數字出現的次數比其他所有數字的出現次數之和還要大,則要找的數字肯定是組後一次把次數設為1時對應的數字。

最後判斷這個數出現的次數是不是大於長度的一半

思路二之使用雜湊表(程式碼略)

思路源於劍指offer34第一個只出現一次的字元

在遍歷陣列時儲存兩個值:一個是陣列中的一個數字,一個是次數。最後判斷有沒有此數大於長度的一半的。

程式碼

思路二的程式碼

public static int GetLeastNumbers_Solution(int[] a, int length) {
	if (length <= 0)
		return 0;
	int result = a[0];
	int times = 1;
	for (int i = 0; i < length; i++) {
		if (times == 0) {
			result = a[i];
			times = 1;
		} else if (result == a[i]) {
			times++;
		} else {
			times--;
		}
	}
	times=0;
	for (int i = 0; i < length; i++) {
		if(a[i]==result){
			times++;
		}
	}
	if(times>length/2)
		return result;
	return 0;
}