劍指Offer-29-java實現查詢陣列中出現次數超過一半的元素
阿新 • • 發佈:2019-02-20
思路:
陣列中有一個數字出現的次數超過陣列長度的一半,也就是說它出現的次數比其他所有數字出現次數的和還要多。
因此我們可以考慮在遍歷陣列的時候儲存兩個值: 一個是陣列中的一個數字, 一個是次數。當我們遍歷到下一個數字的時候,如果下一個數字和我們之前儲存的數字相同,則次數加1:如果下一個數字和我們之前儲存的數字,不同,則次數減1 。如果減1之後,此時次數為零,我們需要儲存下一個數字,並把次數設為1 。由於我們要找的數字出現的次數比其他所有數字出現的次數之和還要多,那麼要找的數字肯定是最後一次次數設定為1的對應的數字。
java具體實現:
/**
* 找出陣列中出現次數超過一半的數字
* 演算法實現思想,定義兩個變數num,count,分別記錄數字遍歷中的數字,和計數器變數。
* 將第一個元素取出來賦值給num,count初始值為1,然後遍歷陣列,依次和前面的num比較,
* 如果相同,則count加1,如果不同則count減1,如果減去之後,count為0,則將當前陣列賦值給num 然後count重置為1
*
*
*/
public class GetOffer {
public static void main(String[] args) {
int arr1[] = { 1, 2, 3, 2, 2, 2, 5, 4, 2 };
int result1 = getNum(arr1);
System.out.println(result1);
int arr2[] = { 2, 2, 2, 2, 2, 1, 3, 4, 5 };
int result2 = getNum(arr2);
System.out.println(result2);
}
private static int getNum(int[] arr) {
// 健壯性
if (arr == null && arr.length < 1) {
return -1;
}
int num = arr[0];
int count = 1;
// 遍歷比較
for (int i = 1; i < arr.length; i++) {
if (num == arr[i]) {
++count;
} else {
count--;
if (count == 0) {
num = arr[i];
count = 1;
}
}
}
// 判斷num是不是目標數字
count = 0;
for (int i = 0; i < arr.length; i++) {
if (arr[i] == num) {
count++;
}
}
if (count >= arr.length / 2) {
return num;
}
return -1;
}
}