題目:
給定乙個非空的整數陣列,返回其**現頻率前 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(nlogk) 。
空間複雜度: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儲存資料統計頻次,然後排序 時間複雜度看排序演...