算法15(力扣347)——前k个高频元素

1、问题

给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。

2、示例

(1)

输入: nums = [1,1,1,2,2,3], k = 2

输出: [1,2]

(2)

输入: nums = [1], k = 1

输出: [1]

3、实现思路

用map数据结构来记录数组中各项出现的次数,然后使用sort排序,通过slice删除数组中多于k的元素项

4、具体步骤

(1)创建集合去重,然后通过解构转为数组

(2)利用map和循环遍历,找到各项的出现频次

(3)利用sort排序,找到频次较高的项

(4)删除多余项( slice 获取开始删除位置之前的部分)

(5)返回

5、完整代码

html 复制代码
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>前k个高频元素</title>
</head>

<body>
  <p>
    给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
  </p>
  <p>
  <p>
    输入: nums = [1,1,1,2,2,3], k = 2
    输出: [1,2]
  </p>
  <p>
    输入: nums = [1], k = 1
    输出: [1]
  </p>
  </p>
  <p>
    用map数据结构来记录数组中各项出现的次数,然后使用sort排序,通过slice删除数组中多于k的元素项
  </p>
  <script>
    let nums = [1,1,1,2,2,3], k = 2
    topKFrequent(nums, k)
    function topKFrequent(nums, k) {
      // 创建集合去重,然后通过解构转为数组
      let set = [...new Set(nums)]
      // 利用map和循环遍历,找到各项的出现频次
      let newMap = new Map()
      nums.forEach((item) =>{        
        if (newMap.has(item)) {
          // set方法设置键和值,利用get方法获取其中非重复项的频次
          newMap.set(item,newMap.get(item)+1)
        }else{
           newMap.set(item,1)
        }
      })
      // 利用sort排序,找到频次较高的项
      set.sort((a,b)=>newMap.get(b) - newMap.get(a))
      // 删除多余项( slice 获取开始删除位置之前的部分)
      set = set.slice(0, k)

      return set
    
      
    };
  </script>
</body>

</html>

6、力扣通过代码

javascript 复制代码
/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number[]}
 */
var topKFrequent = function(nums, k) {
      // 创建集合去重,然后通过解构转为数组
      let set = [...new Set(nums)]
      // 利用map和循环遍历,找到各项的出现频次
      let newMap = new Map()
      nums.forEach((item) =>{        
        if (newMap.has(item)) {
          // set方法设置键和值,利用get方法获取其中非重复项的频次
          newMap.set(item,newMap.get(item)+1)
        }else{
           newMap.set(item,1)
        }
      })
      // 利用sort排序,找到频次较高的项
      set.sort((a,b)=>newMap.get(b) - newMap.get(a))
      // 删除多余项( slice 获取开始删除位置之前的部分)
      set = set.slice(0, k)

      return set
      
      
};
相关推荐
Ring__Rain1 小时前
c版的findcontours改写,输出为vector<vector<cPoint>>
算法
Yoyo25年秋招冲冲冲1 小时前
Day60_补20250208_图论part5_并查集理论基础|寻找存在的路径
java·开发语言·数据结构·算法·leetcode·动态规划·图论
不会敲代码的狗1 小时前
Acwing-基础算法课笔记之基础算法(差分)
笔记·算法
测试19982 小时前
Selenium:网页frame与多窗口处理
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例
阿猿收手吧!2 小时前
【面试】面试常见的智力题
面试·职场和发展
攻城狮7号2 小时前
【10.7】队列-解预算内的最多机器人数目
数据结构·c++·算法
Bran_Liu2 小时前
【LeetCode 刷题】动态规划(5)-子序列问题
python·算法·leetcode·动态规划
LNsupermali2 小时前
力扣1448. 统计二叉树中好节点的数目
算法·leetcode·职场和发展
硕风和炜2 小时前
【LeetCode: 8. 字符串转换整数 (atoi) + 模拟】
java·算法·leetcode·面试·模拟
一叶祇秋2 小时前
Leetcode - 149双周赛
算法·leetcode·职场和发展