算法题解-多数元素2

简介: 算法题解-多数元素2

题目


给定一个大小为 n 的整数数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。

输入: nums = [3,2,3]
输出: [3]


题解


第一种


我们先声明一个变量l,用于记录数组的长度,如果数组长度小于2,直接返回原数组nums,因为数组长度小于2,那么唯一的元素就是主要元素,不需要进行统计,然后我们在定义一个变量n,表示一个阈值,它等于数组长度的1/3,因为一个元素的出现次数超过了这个阈值,就认为它是数组中的主要元素,接下来我们在定义变量i和result,分别表示循环变量和结果数组,变量numsMap是一个空对象,用于记录数组中每个元素出现的次数,我们使用while循环进行循环,循环条件是i小于数组长度并且结果数组result的长度小于2,在循环中我们首先将nums[i]作为key,将numsMap中对应的value加1,表示这个元素又出现了一次,接下来判断这个元素是否出现次数超过了阈值n,并且是否已经存在于结果数组result中,如果是,则将这个元素加入结果数组result中,循环变量i自增1,进入下一轮循环,最后我们将result数组返回出去即可

var majorityElement = function(nums) {
  let l = nums.length;
  if(l < 2) return nums;
  let n = l/3;
  let i = 0;  
  let result = [];
  let numsMap = {};
  while(i < l && result.length < 2){
    numsMap[nums[i]] = (numsMap[nums[i]] || 0) + 1
    if(numsMap[nums[i]] > n && !result.includes(nums[i])){
      result.push(nums[i])
    }
    i++;
  }
  return result;
};


第二种


我们在函数中先创建一个Map对象,用于存放数组中每个元素出现的次数,然后我们创建一个Set对象,用于存放出现次数超过1/3的元素,接下来我们遍历数组中的每个元素,对于每个元素进行判断,如果它已经被加入到Set对象中,就跳过不处理,否则我们就将该元素的出现次数加1,并判断是否超过了数组长度的1/3,如果是就将该元素加入到Set对象中,最后将Set对象中的元素转换为数组返回出去即可

 var majorityElement = function(nums) {
    const map = new Map(); 
    const res = new Set(); 
    const len = nums.length;
    for(let i=0;i<len;i++){
        const item = nums[i];
        if(res.has(item)){ 
            continue;
        }
        map.set(item,(map.get(item)||0)+1);
        if((map.get(item)>(len/3))){
            res.add(item);
        }
    }
    return [...res];
};
相关文章
|
6天前
|
算法 Java
[Java·算法·简单] LeetCode 27. 移除元素 详细解读
[Java·算法·简单] LeetCode 27. 移除元素 详细解读
27 1
|
6天前
|
设计模式 算法 Java
【数据结构和算法】删掉一个元素以后全为 1 的最长子数组
这是力扣的 1493 题,难度为中等,解题方案有很多种,本文讲解我认为最奇妙的一种。又又又是一道滑动窗口的典型例题,可以帮助我们巩固滑动窗口算法。这道题很活灵活现,需要加深对题意的变相理解。给你一个二进制数组nums,你需要从中删掉一个元素。 请你在删掉元素的结果数组中,返回最长的且只包含 1 的非空子数组的长度。 如果不存在这样的子数组,请返回 0 。
67 1
|
6天前
|
存储 算法
代码随想录算法训练营第五十九天 | LeetCode 739. 每日温度、496. 下一个更大元素 I
代码随想录算法训练营第五十九天 | LeetCode 739. 每日温度、496. 下一个更大元素 I
23 1
|
6天前
|
算法
代码随想录算法训练营第五十七天 | LeetCode 739. 每日温度、496. 下一个更大元素 I
代码随想录算法训练营第五十七天 | LeetCode 739. 每日温度、496. 下一个更大元素 I
18 3
|
6天前
|
算法 测试技术 Serverless
【二分查找】【C++算法】378. 有序矩阵中第 K 小的元素
【二分查找】【C++算法】378. 有序矩阵中第 K 小的元素
|
6天前
|
算法
常见算法题——203.移除链表元素
【2月更文挑战第9天】
26 0
|
6天前
|
搜索推荐 算法
在冒泡排序算法中,为什么每次比较相邻的元素时都要进行交换?
【2月更文挑战第8天】【2月更文挑战第21篇】在冒泡排序算法中,为什么每次比较相邻的元素时都要进行交换?
|
6天前
|
算法
|
6天前
|
搜索推荐 算法 测试技术
【排序算法】【二叉树】【滑动窗口】LeetCode220: 存在重复元素 III
【排序算法】【二叉树】【滑动窗口】LeetCode220: 存在重复元素 III
|
6天前
|
存储 算法
算法题解-二叉搜索树中第K小的元素
算法题解-二叉搜索树中第K小的元素