【LeetCode】347.前 K 個高頻元素

今日學習的文章鏈接和視頻鏈接

leetcode題目地址:347.前 K 個高頻元素

?代碼隨想錄題解地址:代碼隨想錄

題目簡介

給你一個整數數組?nums?和一個整數?k?,請你返回其中出現頻率前?k?高的元素。你可以按?任意順序?返回答案。

看到題目的第一想法(可以貼代碼)

1. 想不到怎么使用stack和queue來解決該問題,采用的是直線思維。

先對數組排序,再遍歷數組,用hashmap才存儲元素值(key)和元素出現的次數(value),然后對hashmap的valueSet進行降序排序,再取前k個元素,作為result。

class Solution {public int[] topKFrequent(int[] nums, int k) {//只有一個元素的情況if(nums.length == 1) return nums;//存儲最終結果int[] res = new int[k];//先對原始數組進行排序Arrays.sort(nums);//存儲數字和他們出現的頻率HashMap<Integer, Integer> hm = new HashMap<Integer, Integer>();int temp = nums[0];int count = 1;for(int i = 1; i < nums.length; i++){//如果和上一個數一致,則該數出現次數+1if(nums[i] == temp){count++;}else{//如果和上一個數不同,則識別為另一個數字的開頭hm.put(temp,count);temp = nums[i];count = 1;}//判定是否到末尾,需要回收末尾(末尾只剩一個數 or 末尾連續幾個數都一樣 時,都只需要put就行)if(i == nums.length - 1){hm.put(temp,count);}}List<Map.Entry<Integer, Integer>> list = new ArrayList<Map.Entry<Integer, Integer>>(hm.entrySet());// 使用Collections.sort()排序,按value,即按出現次數進行排序Collections.sort(list, new Comparator<Map.Entry<Integer, Integer>>() {@Overridepublic int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {return o2.getValue().compareTo(o1.getValue());}});// for-each循環, 獲得排序后的結果int index = 0;for (Map.Entry<Integer, Integer> mapping : list){//System.out.println(mapping.getKey() + ":" + mapping.getValue());//判定是否已獲取k個最高頻數字if(index != k){res[index++] = mapping.getKey();}else{break;}}return res;}
}

實現過程中遇到哪些困難

1.?想不到怎么使用stack和queue來解決該問題

看完代碼隨想錄之后的想法

【解題思路】和我的基本一致,但在對“元素出現頻率”進行排序時,我用的是普通排序時間復雜度為n*log(n),答案采用小頂堆排序,時間復雜度為n*log(k)

【想法】無

標準答案

class Solution {//解法2:基于小頂堆實現public int[] topKFrequent2(int[] nums, int k) {Map<Integer,Integer> map = new HashMap<>();//key為數組元素值,val為對應出現次數for(int num:nums){map.put(num,map.getOrDefault(num,0)+1);}//在優先隊列中存儲二元組(num,cnt),cnt表示元素值num在數組中的出現次數//出現次數按從隊頭到隊尾的順序是從小到大排,出現次數最低的在隊頭(相當于小頂堆)PriorityQueue<int[]> pq = new PriorityQueue<>((pair1,pair2)->pair1[1]-pair2[1]);for(Map.Entry<Integer,Integer> entry:map.entrySet()){//小頂堆只需要維持k個元素有序if(pq.size()<k){//小頂堆元素個數小于k個時直接加pq.add(new int[]{entry.getKey(),entry.getValue()});}else{if(entry.getValue()>pq.peek()[1]){//當前元素出現次數大于小頂堆的根結點(這k個元素中出現次數最少的那個)pq.poll();//彈出隊頭(小頂堆的根結點),即把堆里出現次數最少的那個刪除,留下的就是出現次數多的了pq.add(new int[]{entry.getKey(),entry.getValue()});}}}int[] ans = new int[k];for(int i=k-1;i>=0;i--){//依次彈出小頂堆,先彈出的是堆的根,出現次數少,后面彈出的出現次數多ans[i] = pq.poll()[0];}return ans;}
}

學習時長


今日收獲

1. 使用Collections.sort()排序,按value排序

List<Map.Entry<Integer, Integer>> list = new ArrayList<Map.Entry<Integer, Integer>>(hm.entrySet());// 使用Collections.sort()排序,按value排序
Collections.sort(list, new Comparator<Map.Entry<Integer, Integer>>() {@Overridepublic int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {return o2.getValue().compareTo(o1.getValue());}
});// for-each循環
int index = 0;
for (Map.Entry<Integer, Integer> mapping : list){System.out.println(mapping.getKey() + ":" + mapping.getValue());if(index != k){res[index++] = mapping.getKey();}else{break;}
}

2. PriorityQueue小頂堆

PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>(); //小頂堆,默認容量為11
PriorityQueue<Integer> maxHeap = new PriorityQueue<Integer>(11,new Comparator<Integer>(){ //大頂堆,容量11@Overridepublic int compare(Integer i1,Integer i2){return i2-i1;}
});

ps: add自動維持頂部為最小的值。?

3. HashMap獲取key序列或value序列

        HashMap<String, Integer> map = new HashMap<String, Integer>();map.put("Kobe", 1);map.put("Jordan", 2);map.put("James", 3);//通過keySet()獲取key,再通過map.get(key)獲取valueSet<String> set = map.keySet();for(String str : set) {System.out.println(str + " " + map.get(str));}System.out.println( "------------" );//通過map.entrySet()獲得鍵值對,性能較高Set<Entry<String, Integer>> en = map.entrySet();for(Entry<String, Integer> entry : en) {System.out.println(entry.getKey() + " " + entry.getValue());}System.out.println( "------------" );//通過values()取值Collection<Integer> values = map.values();for(Integer i : values)System.out.println(i);	//上面似乎有bug
//-------------------------------------------------------------// 1. 使用 Iterator 遍歷 EntrySetIterator < Entry < Integer, String >> iterator = coursesMap.entrySet().iterator();while (iterator.hasNext()) {Entry < Integer, String > entry = iterator.next();System.out.println(entry.getKey());System.out.println(entry.getValue());}// 2. 使用 Iterator 遍歷 HashMap KeySetIterator < Integer > iterator = coursesMap.keySet().iterator();while (iterator.hasNext()) {Integer key = iterator.next();System.out.println(key);System.out.println(coursesMap.get(key));}// 3. 使用 For-each 循環遍歷 HashMapfor (Map.Entry < Integer, String > entry: coursesMap.entrySet()) {System.out.println(entry.getKey());System.out.println(entry.getValue());}// 4. 使用 Lambda 表達式遍歷 HashMapcoursesMap.forEach((key, value) -> {System.out.println(key);System.out.println(value);});

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/713028.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/713028.shtml
英文地址,請注明出處:http://en.pswp.cn/news/713028.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python-公共操作與推導式

一、公共操作 運算符 (1)&#xff1a;合并操作符 適用范圍&#xff1a;字符串、列表、元組 (2)*&#xff1a;復制 適用范圍&#xff1a;字符串、列表、元組 (3)in&#xff1a;判斷某字符串存在 (4)not in&#xff1a;判斷某字符串不存在 list1[1,2] list2[3,4] t1(1,2) t2(3,…

手把手教你在 CentOS7 上部署Ngrok (踩坑填坑)

一、項目準備 1、一個可用的域名&#xff08;不是必須&#xff0c;但是最好有&#xff09; 2、一臺有公網IP的服務器 二、項目實施 本文的操作過程主要參考了《教你自己服務器搭建Ngrok》&#xff0c;但是隨著時間的推移&#xff0c;很多軟件因版本升級而產生了一些變化&…

掌握 MySQL 的數據類型

知道了表是由不同數據類型的列組成的&#xff0c;然后填充了一行一行的數據。 當我們要創建表的時候&#xff0c;就要根據業務需求&#xff0c;選擇合適的數據類型。比如在實戰項目中&#xff0c;文章表就是由下面這些不同數據類型的字段定義的。 目前用到了 bigint、tinyint、…

vue3+ts+vite使用mock數據

安裝以下命令 npm i vite-plugin-mock --save-dev npm i mockjs --save-dev 在根路徑下創建mock文件夾 mock\user.ts const menuList [{path: /system,component: Layout,name: system,meta: {title: 系統管理,icon: Setting,roles: [sys:manage]},children: [{path: /depar…

blender 導出bvh x軸旋轉90度

目錄 blender導出模型后&#xff0c;x 軸旋轉了 90 度&#xff0c;和縮放不對的問題 bvh&#xff1a; blender導出模型后&#xff0c;x 軸旋轉了 90 度&#xff0c;和縮放不對的問題 博文解決了fbx格式d軸旋轉90度的問題&#xff0c;bvh的沒有解決 Blender - Export FBX to …

Java中使用poi+poi-tl實現根據模板導出word文檔

場景 若依管理系統前后端分離版基于ElementUI和SpringBoot怎樣實現Excel導入和導出: 若依管理系統前后端分離版基于ElementUI和SpringBoot怎樣實現Excel導入和導出_若依導出前端獲得到后端的execl流之后怎么操作-CSDN博客 上面講的是Excel的導出&#xff0c;如果是需要根據w…

即插即用篇 | YOLOv8 引入 MHSA 注意力機制 | 《Bottleneck Transformers for Visual Recognition》

論文名稱:《Bottleneck Transformers for Visual Recognition》 論文地址:https://arxiv.org/pdf/2101.11605.pdf 文章目錄 1 原理2 源代碼3 添加方式4 模型 yaml 文件template-backbone.yamltemplate-small.yamltemplate-large.yamltemplate-neck.yaml

Mac 重新安裝系統

Mac 重新安裝系統 使用可引導安裝器重新安裝&#xff08;可用于安裝非最新的 Mac OS&#xff0c;系統降級&#xff0c;需要清除所有數據&#xff09; 插入制作好的可引導安裝器&#xff08;U盤或者移動固態硬盤&#xff09;&#xff0c;如何制作可引導安裝器將 Mac 關機將 Ma…

排序——冒泡排序

冒泡排序的基本思想 從前往后&#xff08;或從后往前&#xff09;兩兩比較相鄰元素的值&#xff0c;若為逆序&#xff08;即 A [ i ? 1 ] < A [ i ] A\left [ i-1\right ]<A\left [ i\right ] A[i?1]<A[i]&#xff09;&#xff0c;則交換它們&#xff0c;直到序列…

MySQL慢查詢分析

1. 什么是慢查詢&#xff1f; 在MySQL中&#xff0c;慢查詢定義為執行時間超過特定閾值的查詢。這個閾值可以通過MySQL的配置選項long_query_time來設置。默認情況下&#xff0c;long_query_time的值是10秒&#xff0c;意味著任何執行時間超過10秒的查詢都會被認為是慢查詢。然…

標準PoE交換機、非標準PoE交換機和非PoE交換機三者到底有何區別?

目錄 前言&#xff1a; 一、標準PoE交換機 1.1 工作原理 1.2 應用場景 1、視頻監控 2、無線接入點 3、IP電話 1.3 優勢 1、簡化布線 2、簡化安裝 3、提高可靠性 二、非標準PoE交換機 2.1 工作原理 2.2 應用場景 1、無線路由器 2、IP電話 3、數據中心 2.3 優勢…

c++面試三 -- 智能指針--7000字

一、智能指針 C 中的智能指針是一種用于管理動態分配的內存的對象&#xff0c;它們可以自動進行內存管理&#xff0c;避免內存泄漏和懸掛指針等問題。 1. 懸掛指針 懸掛指針&#xff08;dangling pointer&#xff09;是指在程序中仍然存在但已經不再指向有效內存地址的指針。懸…

IO多路復用 poll模型

poll 是一種在 Linux 系統中進行 I/O 多路復用的模型&#xff0c;它與 select 類似&#xff0c;但具有一些不同之處。poll 允許監視的文件描述符數量不受限制&#xff0c;而不像 select 有一定的限制。 基本概念&#xff1a; poll 函數&#xff1a; 通過 poll 函數&#xff0c…

隊列的結構概念和實現

文章目錄 一、隊列的結構和概念二、隊列的實現三、隊列的實現函數四、隊列的思維導圖 一、隊列的結構和概念 什么是隊列&#xff1f; 隊列就是只允許在一端進行插入數據操作&#xff0c;在另一端進行刪除數據操作的特殊線性表&#xff0c;隊列具有先進先出 如上圖所示&#x…

【比較mybatis、lazy、sqltoy、mybatis-flex操作數據】操作批量新增、分頁查詢(二)

orm框架使用性能比較 環境&#xff1a; idea jdk17 spring boot 3.0.7 mysql 8.0比較mybatis、lazy、sqltoy、mybatis-flex操作數據 測試條件常規對象 orm 框架是否支持xml是否支持 Lambda對比版本mybatis????3.5.4sqltoy????5.2.98lazy????1.2.4-JDK17-SNAPS…

自定義 Python 程序參數解析

需要通過Python程序運行其它應用程序&#xff0c;程序格式為&#xff1a; 我的程序 <我的程序參數> 應用程序 <應用程序參數> 由于應用程序不固定&#xff0c;應用程序的參數也不固定&#xff0c;我的程序不需要對應用程序參數進行解析&#xff0c;僅需要解析自己的…

Vue+SpringBoot打造天然氣工程運維系統

目錄 一、摘要1.1 項目介紹1.2 項目錄屏 二、功能模塊2.1 系統角色分類2.2 核心功能2.2.1 流程 12.2.2 流程 22.3 各角色功能2.3.1 系統管理員功能2.3.2 用戶服務部功能2.3.3 分公司&#xff08;施工單位&#xff09;功能2.3.3.1 技術員角色功能2.3.3.2 材料員角色功能 2.3.4 安…

快速冪-計算a的b次對m取余

題目 題解參考 a a ? a a a*a aa?a這部分是計算 a 2 i a^{2^i} a2i&#xff0c; a b Π i 0 t a n i 2 i Π i 0 t ( a 2 i ) n i a^b \Pi_{i0}^{t}a^{n_i 2^i} \Pi_{i0}^{t}(a^{2^i})^{n_i} abΠi0t?ani?2iΠi0t?(a2i)ni? ,代碼中的b&1是計算 n i n_i ni?…

Zabbix企業運維監控工具

Zabbix企業級監控方案 常見監控軟件介紹 Cacti Cacti是一套基于 PHP、MySQL、SNMP 及 RRD Tool 開發的監測圖形分析工具&#xff0c;Cacti 是使用輪詢的方式由主服務器向設備發送數據請求來獲取設備上狀態數據信息的,如果設備不斷增多,這個輪詢的過程就非常的耗時&#xff0…

sql注入less46作業三

采用報錯注入 updatexml(XML_document,XPath_string,new_value) 一共可以接收三個參數&#xff0c;報錯位置在第二個參數。 ?sort1 and updatexml(1,concat(0x7e,database(),0x7e),1)-- #查詢庫名 ?sort1 and updatexml(1,concat(0x7e,(select group_concat(table_name) fr…