leetcode 347前k個高頻元素

2021-09-24 19:59:26 字數 2563 閱讀 3869

題目:

給定乙個非空的整數陣列,返回其**現頻率前 k 高的元素。

示例 1:

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

輸出: [1,2]

示例 2:

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

輸出: [1]

說明:你可以假設給定的 k 總是合理的,且 1 ≤ k ≤ 陣列中不相同的元素的個數。

你的演算法的時間複雜度必須優於 o(n log n) , n 是陣列的大小。

**1思路:

priorityqueue 乙個基於優先順序的無界優先順序佇列。優先順序佇列的元素按照其自然順序進行排序,或者根據構造佇列時提供的 comparator 進行排序,具體取決於所使用的構造方法。該佇列不允許使用 null 元素也不允許插入不可比較的物件(沒有實現comparable介面的物件)。最小堆是經過排序的完全二叉樹,其中任意非終端節點的值均不大於左右節點的值。

複雜度分析:

時間複雜度:o(nlogk), n 表示陣列的長度。首先,遍歷一遍陣列統計元素的頻率,這一系列操作的時間複雜度是 o(n);接著,遍歷用於儲存元素頻率的 map,如果元素的頻率大於最小堆中頂部的元素,則將頂部的元素刪除並將該元素加入堆中,**這裡維護堆的數目是 k **,所以這一系列操作的時間複雜度是 o(nlogk)的;因此,總的時間複雜度是 o(nlog⁡k) 。

空間複雜度:o(n),最壞情況下(每個元素都不同),map 需要儲存 n 個鍵值對,優先佇列需要儲存 k個元素,因此,空間複雜度是 o(n)。

我自己寫了**1,但是出現了好多問題,乙個是hashmap中的好幾個方法都不怎麼熟,不會用;除此之外的使用優先佇列構造最小堆也不怎麼會寫;還有就是我自己寫**的習慣問題了,總是寫錯單詞,這種除錯起來非常麻煩,特變難找到,建議寫完**之後還是整體自己先檢查一遍,重點看有沒有拼錯。

peek():用於檢索或獲取queue的第乙個元素或queue頭部的元素。檢索到的元素不會從佇列中刪除或刪除。

containskey():是否包含某乙個key

map.keyset():hashmap中取出所有鍵的方法。

map集合中提供了兩種取出方式:

<1>.  返回值型別set方法是: keyset()   :返回此對映中包含的鍵的 set 檢視

將map中所有的鍵存入到set集合,因為set具備迭代器,所有迭代方式取出所有的鍵

再根據get()方法  ,獲取每乙個鍵對應的值

<2>.  返回值型別:set>方法是:entryset()

取出的是關係,關係中包含key和value,其中map.entry來表示這種資料型別

即:將map集合中的對映關係存入到set集合中,這個關係的資料型別為:map.entry

**1:

class solution

else

}// 遍歷map,用最小堆儲存頻率最大的k個元素,預設的情況下就是實現的小頂堆。

priorityqueuepq = new priorityqueue<>(new comparator()

});

for (integer key : map.keyset())

else if (map.get(key) > map.get(pq.peek()))

}// 取出最小堆中的元素

listres = new arraylist<>();

while (!pq.isempty())

return res;}}

**二來自大神cyc2018。思路是使用桶排序。

複雜度分析

時間複雜度:o(n), n 表示陣列的長度。首先,遍歷一遍陣列統計元素的頻率,這一系列操作的時間複雜度是 o(n);桶的數量為 n + 1,所以桶排序的時間複雜度為 o(n);因此,總的時間複雜度是 o(n)。

空間複雜度:很明顯為 o(n)

思路:這個是使用桶排序,首先第一步還是使用hashmap統計出現的頻率。然後建立乙個桶,將出現次數為i的數字放置在相應的桶中的list裡面,最後從後往前進行遍歷,知道取出k個數字。

特別注意,方法ketset()中的第乙個字母k是不大寫的,今天找了好長時間的錯誤,要氣**。。。。。

**2:

public listtopkfrequent(int nums, int k)

list buckets = new arraylist[nums.length + 1];

for (int key : frequencyfornum.keyset())

buckets[frequency].add(key);

}listtopk = new arraylist<>();

for (int i = buckets.length - 1;i >= 0 && topk.size()< k; i--)

if (buckets[i].size() <= (k - topk.size())) else

}return topk;

}

Leetcode 347 前K個高頻元素

給定乙個非空的整數陣列,返回其 現頻率前k高的元素。示例 1 輸入 nums 1,1,1,2,2,3 k 2 輸出 1,2 示例 2 輸入 nums 1 k 1 輸出 1 說明 首先都要先用hash表統計一次頻率,乙個思路是排序,取前k個元素 第二個思路是使用優先佇列,這裡提供兩種 class so...

Leetcode347 前K個高頻元素

給定乙個非空的整數陣列,返回其 現頻率前 k 高的元素。示例 1 輸入 nums 1,1,1,2,2,3 k 2 輸出 1,2 示例 2 輸入 nums 1 k 1 輸出 1 說明 你可以假設給定的 k 總是合理的,且 1 k 陣列中不相同的元素的個數。你的演算法的時間複雜度必須優於 o n log...

LeetCode 347 前K個高頻元素

347.前 k 個高頻元素 給定乙個非空的整數陣列,返回其 現頻率前k高的元素。示例 1 輸入 nums 1,1,1,2,2,3 k 2輸出 1,2 示例 2 輸入 nums 1 k 1輸出 1 說明 解題思路 1.排序法 使用unordered map儲存資料統計頻次,然後排序 時間複雜度看排序演...