【劍指offer】39.數組中出現次數超過一半的數字

39.數組中出現次數超過一半的數字

面試題39. 數組中出現次數超過一半的數字

難度簡單19

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

你可以假設數組是非空的,並且給定的數組總是存在多數元素。

示例 1:

輸入: [1, 2, 3, 2, 2, 2, 5, 4, 2]
輸出: 2

1.哈希表

   //哈希表
        //1.將數組中元素作爲key value爲出現的次數
        //2.遍歷哈希表中所有key 找出出現最大的次數 
        // time :O(n) 遍歷數組n次
        // space : 將元素存儲到哈希表中所佔用的空間
        public int majorityElement(int[] nums) {
            if(nums == null || nums.length == 0){
                return -1;
            }      
            Map<Integer,Integer> results = new HashMap<>();
            for(int i=0;i<nums.length;i++){
                if(!results.containsKey(nums[i]))
                    results.put(nums[i],1);
                else
                    results.put(nums[i],results.get(nums[i])+1);
            }
    
            Map.Entry<Integer, Integer> majorityEntry = null;
            for (Map.Entry<Integer, Integer> entry : results.entrySet()) {
                if (majorityEntry == null || entry.getValue() > majorityEntry.getValue()) {
                    majorityEntry = entry;
                }
            }
    
            return majorityEntry.getKey();
        }

2.排序

  // time : (OlogN) 數組排序需要的時間
        // space : (logN) 數組排序需要的外部存儲空間 語言自身的排序空間是OlogN
        // ps : 當數組中有大於一半以上的數據時,如果將數組進行排序,那麼中間下標位置一定是衆數的下標。
        // 無論是偶數 還是 奇數。
        // 衆數 : 在一組數據中出現次數最多的數字。
        public int majorityElement(int[] nums) {
            Arrays.sort(nums);
            return nums[nums.length/2];
        }

3.Boyer-Moore 投票算法

// Boyer-Moore 投票算法
    // 核心思想 
    // 如果候選人不是maj 則 maj,會和其他非候選人一起反對 會反對候選人,所以候選人一定會下臺(maj==0時發生換屆選舉)
    // 如果候選人是maj , 則maj 會支持自己,其他候選人會反對,同樣因爲maj 票數超過一半,所以maj 一定會成功當選
    // time : O(n) 一次loop array
    // space : O(1) 
    public int majorityElement(int[] nums) {
        if(nums == null || nums.length == 0) return -1;
        int count = 0;
        Integer candidate = null;

        for(int num : nums){
            if(count == 0){
                candidate = num;//更換候選人
            }
            //count += ((num == candidate) ? 1 : -1);
             count += (num == candidate) ? 1 : -1;
        }
        return candidate;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章