【Java】【JS】LeetCode - 排序 - 哈希表 - 分治 - #169 多數元素

精誠所至金石爲開!力扣力扣:https://leetcode-cn.com/problems/majority-element/

#169 多數元素

給定一個大小爲 n 的數組,找到其中的多數元素。多數元素是指在數組中出現次數大於 ⌊ n/2 ⌋ 的元素。

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

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

官方五種方法:https://leetcode-cn.com/problems/majority-element/solution/duo-shu-yuan-su-by-leetcode-solution/

方法一:排序找中值

如果將數組 nums 中的所有元素按照單調遞增或單調遞減的順序排序,那麼下標爲 n/2 的元素(下標從 0 開始)一定是衆數。

class Solution {
    public int majorityElement(int[] nums) {
        Arrays.sort(nums);
        int mid = nums.length / 2;
        return nums[mid];
    }
}
var majorityElement = function(nums) {
    nums.sort((a,b) => a-b);
    return nums[Math.floor(nums.length/2)];
};

方法二:哈希表

遍歷哈希表操作的四種方法:https://blog.csdn.net/kyi_zhu123/article/details/52769469

我們使用哈希映射(HashMap)來存儲每個元素以及出現的次數。對於哈希映射中的每個鍵值對,鍵表示一個元素,值表示該元素出現的次數。

我們用一個循環遍歷數組 nums 並將數組中的每個元素加入哈希映射中。在這之後,我們遍歷哈希映射中的所有鍵值對,返回值最大的鍵。我們同樣也可以在遍歷數組 nums 時候使用打擂臺的方法,維護最大的值,這樣省去了最後對哈希映射的遍歷。

class Solution {
    public int majorityElement(int[] nums) {
        Map<Integer, Integer> counts = countNums(nums);
        Map.Entry<Integer, Integer> major = null;
        for(Map.Entry<Integer, Integer> entry : counts.entrySet()){
            if(major == null || entry.getValue() > major.getValue()){
                major = entry;
            }
        }
        return major.getKey();
    }
    private Map<Integer, Integer> countNums(int[] nums){
        Map<Integer, Integer> counts = new HashMap<Integer, Integer>();
        for(int num : nums){
            if(!counts.containsKey(num)){
                counts.put(num, 1);
            }else{
                counts.put(num, counts.get(num)+1);
            }
        }
        return counts;
    }
}
/**
 * @param {number[]} nums
 * @return {number}
 */
var majorityElement = function(nums) {
    let map = new Map()
    for(let i = 0; i < nums.length; i++){
        if(map.has(nums[i])){
            map.set(nums[i], map.get(nums[i])+1)
        }else{
            map.set(nums[i], 1)
        }
    }
    for(let item of map.entries()){
        if(item[1]>nums.length/2){
            return item[0]
        }
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章