From 555dfe5590534b78944127e379602741b5408d68 Mon Sep 17 00:00:00 2001 From: huangge1199 Date: Fri, 3 Sep 2021 13:43:47 +0800 Subject: [PATCH] =?UTF-8?q?347:=E5=89=8D=20K=20=E4=B8=AA=E9=AB=98=E9=A2=91?= =?UTF-8?q?=E5=85=83=E7=B4=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../editor/cn/TopKFrequentElements.java | 77 +++++++++++++++++++ .../cn/doc/content/TopKFrequentElements.md | 31 ++++++++ 2 files changed, 108 insertions(+) create mode 100644 src/main/java/leetcode/editor/cn/TopKFrequentElements.java create mode 100644 src/main/java/leetcode/editor/cn/doc/content/TopKFrequentElements.md diff --git a/src/main/java/leetcode/editor/cn/TopKFrequentElements.java b/src/main/java/leetcode/editor/cn/TopKFrequentElements.java new file mode 100644 index 0000000..28041d4 --- /dev/null +++ b/src/main/java/leetcode/editor/cn/TopKFrequentElements.java @@ -0,0 +1,77 @@ +//给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 +// +// +// +// 示例 1: +// +// +//输入: nums = [1,1,1,2,2,3], k = 2 +//输出: [1,2] +// +// +// 示例 2: +// +// +//输入: nums = [1], k = 1 +//输出: [1] +// +// +// +// 提示: +// +// +// 1 <= nums.length <= 10⁵ +// k 的取值范围是 [1, 数组中不相同的元素的个数] +// 题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的 +// +// +// +// +// 进阶:你所设计算法的时间复杂度 必须 优于 O(n log n) ,其中 n 是数组大小。 +// Related Topics 数组 哈希表 分治 桶排序 计数 快速选择 排序 堆(优先队列) 👍 853 👎 0 + +package leetcode.editor.cn; + +import java.util.*; + +//347:前 K 个高频元素 +class TopKFrequentElements { + public static void main(String[] args) { + //测试代码 + Solution solution = new TopKFrequentElements().new Solution(); + solution.topKFrequent(new int[]{1, 1, 1, 2, 2, 3}, 2); + } + + //力扣代码 + //leetcode submit region begin(Prohibit modification and deletion) + class Solution { + public int[] topKFrequent(int[] nums, int k) { + Map counts = new HashMap<>(); + for (int num : nums) { + counts.put(num, counts.getOrDefault(num, 0) + 1); + } + Map> map = new HashMap<>(); + for (int key : counts.keySet()) { + List temp = map.getOrDefault(counts.get(key), new ArrayList<>()); + temp.add(key); + map.put(counts.get(key), new ArrayList<>(temp)); + } + List list = new ArrayList<>(map.keySet()); + int[] arr = new int[k]; + int index = 0; + for (int i = list.size() - 1; i >= 0; i--) { + List temp = map.get(list.get(i)); + for (int j = index; j < index + temp.size(); j++) { + arr[j] = temp.get(j - index); + } + index += temp.size(); + if (index == k) { + break; + } + } + return arr; + } + } +//leetcode submit region end(Prohibit modification and deletion) + +} \ No newline at end of file diff --git a/src/main/java/leetcode/editor/cn/doc/content/TopKFrequentElements.md b/src/main/java/leetcode/editor/cn/doc/content/TopKFrequentElements.md new file mode 100644 index 0000000..b139850 --- /dev/null +++ b/src/main/java/leetcode/editor/cn/doc/content/TopKFrequentElements.md @@ -0,0 +1,31 @@ +

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

+ +

 

+ +

示例 1:

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

示例 2:

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

 

+ +

提示:

+ +
    +
  • 1 <= nums.length <= 105
  • +
  • k 的取值范围是 [1, 数组中不相同的元素的个数]
  • +
  • 题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的
  • +
+ +

 

+ +

进阶:你所设计算法的时间复杂度 必须 优于 O(n log n) ,其中 n 是数组大小。

+
Related Topics
  • 数组
  • 哈希表
  • 分治
  • 桶排序
  • 计数
  • 快速选择
  • 排序
  • 堆(优先队列)

  • 👍 853
  • 👎 0
  • \ No newline at end of file