1. 程式人生 > 實用技巧 >LeetCode(169):多數元素

LeetCode(169):多數元素

題目描述

實現思路

根據題目的描述,可以理解為:
在給定的陣列中 找出 出現次數最多的一個元素(假定一定有一個這樣的元素)
那麼我們可以藉助一個雜湊表 來儲存各個元素出現的次數
遍歷完陣列後,再找出雜湊表中的value最大值

程式碼實現(Javascript)

首先遍歷陣列:
1、用map.get(key)方法拿到當前元素出現的次數
2、用map.set(key,value)方法 讓其次數+1

然後用 array.from(map) 方法將雜湊錶轉換成陣列
(陣列中的每個元素都是一個物件)
並根據value值從大到小排序
返回最大的value值所對應的key值

var majorityElement = function(nums) {
    var myMap=new Map()
    for(let i=0;i<nums.length;i++){
        let v=myMap.get(nums[i])
        if(v!==undefined){
            v++
            myMap.set(nums[i],v)
        }else{
            myMap.set(nums[i],1)
        }
    }

    var arr=Array.from(myMap)
    arr.sort(function(a,b){
        return b[1]-a[1]
    })

    return arr[0][0]
};

注意到題目說:多數元素是指在陣列中出現次數大於 n/2 的元素(且唯一)
因此,我們可以在迴圈中,對v再做一層判斷
若v > n/2,則當前元素一定是我們要找的那個元素

/**
 * @param {number[]} nums
 * @return {number}
 */
var majorityElement = function(nums) {
    var myMap=new Map()
    for(let i=0;i<nums.length;i++){
        let v=myMap.get(nums[i])
        if(v!==undefined){
            v++
            if(v>Math.floor(nums.length/2)){
                return nums[i]
            }
            myMap.set(nums[i],v)
        }else{
            myMap.set(nums[i],1)
        }
    }

    var arr=Array.from(myMap)
    arr.sort(function(a,b){
        return b[1]-a[1]
    })

    return arr[0][0]
};