劍指Offer-29-java實現查找數組中出現次數超過一半的元素

思路:
數組中有一個數字出現的次數超過數組長度的一半,也就是說它出現的次數比其他所有數字出現次數的和還要多。
因此我們可以考慮在遍歷數組的時候保存兩個值: 一個是數組中的一個數字, 一個是次數。當我們遍歷到下一個數字的時候,如果下一個數字和我們之前保存的數字相同,則次數加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;
    }
}
發佈了65 篇原創文章 · 獲贊 67 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章