LeetCode-347:Top K Frequent Elements(取前k個頻率最高的元素)
題目:
Given a non-empty array of integers, return the k most frequent elements.
例子:
Example:
Given [1,1,1,2,2,3] and k = 2, return [1,2].
Note:
* You may assume k is always valid, 1 ≤ k ≤ number of unique elements.
* Your algorithm’s time complexity must be better than O(n log n), where n is the array’s size.
問題解析:
解題思路:
使用雜湊表(python 中字典)來儲存各個元素出現的次數,鍵(key)為對應元素,值(value)為對應元素出現個數。再對該雜湊表(字典)按照值進行排序。
程式碼(python):
class Solution(object):
def topKFrequent(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: List[int]
"""
Dict = {}
for i in range(len(nums)):
if nums[i] in Dict:
Dict[nums[i]] = Dict[nums[i]] + 1
else:
Dict[nums[i]] = 1
output = sorted(Dict.items(), key=lambda e: e[1], reverse=True)
final = []
for i in range(k):
final.append(output[i][0 ])
return final
solution = Solution()
output = solution.topKFrequent([1,1,1,2,2,3],2)
print(output)
關於程式中python內建函式sorted方法的備註
- 描述
- sorted() 函式對所有可迭代的物件進行排序操作。
sort 與 sorted 區別:
- sort 是應用在 list 上的方法,sorted 可以對所有可迭代的物件進行排序操作。
- list 的 sort 方法返回的是對已經存在的列表進行操作,而內建函式 sorted 方法返回的是一個新的 list,而不是在原來的基礎上進行的操作。
語法
- sorted 語法:
sorted(iterable[, cmp[, key[, reverse]]]) - 引數說明:
- iterable – 可迭代物件。
- cmp – 比較的函式,這個具有兩個引數,引數的值都是從可迭代物件中取出,此函式必須遵守的規則為,大於則返回1,小於則返回-1,等於則返回0。
- key – 主要是用來進行比較的元素,只有一個引數,具體的函式的引數就是取自於可迭代物件中,指定可迭代物件中的一個元素來進行排序。
- reverse – 排序規則,reverse = True 降序 , reverse = False 升序(預設)。
- sorted 語法:
- 返回值
返回重新排序的列表。 - 例項
以下例項展示了 sorted 的使用方法
>>>a = [5,7,6,3,4,1,2]
>>> b = sorted(a) # 保留原列表
>>> a
[5, 7, 6, 3, 4, 1, 2]
>>> b
[1, 2, 3, 4, 5, 6, 7]
>>> L=[('b',2),('a',1),('c',3),('d',4)]
>>> sorted(L, cmp=lambda x,y:cmp(x[1],y[1])) # 利用cmp函式
[('a', 1), ('b', 2), ('c', 3), ('d', 4)]
>>> sorted(L, key=lambda x:x[1]) # 利用key
[('a', 1), ('b', 2), ('c', 3), ('d', 4)]
>>> students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
>>> sorted(students, key=lambda s: s[2]) # 按年齡排序
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
>>> sorted(students, key=lambda s: s[2], reverse=True) # 按降序
[('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
>>>
參考網址:
相關推薦
LeetCode-347:Top K Frequent Elements(取前k個頻率最高的元素)
題目: Given a non-empty array of integers, return the k most frequent elements. 例子: Example: Given [1,1,1,2,2,3] and k = 2, ret
【python3】leetcode 347. Top K Frequent Elements(Medium)
347. Top K Frequent Elements(Medium) Given a non-empty array of integers, return the k most frequent elements. Example 1: Inpu
347. Top K Frequent Elements(python+cpp)
題目: Given a non-empty array of integers, return the k most frequent elements. Example 1: Input: nums = [1,1,1,2,2,3], k = 2 Output: [1
Leetcode 142:環形連結串列 II(最詳細的解法!!!)
給定一個連結串列,返回連結串列開始入環的第一個節點。 如果連結串列無環,則返回 null。 **說明:**不允許修改給定的連結串列。 進階: 你是否可以不用額外空間解決此題? 解題思路 這是之前問題Leetcode 141:環形連結串列(最詳細的解法!!!)的提高,我們還
Leetcode 937:重新排列日誌檔案(最詳細的解法!!!)
你有一個日誌陣列 logs。每條日誌都是以空格分隔的字串。 對於每條日誌,其第一個字為字母數字識別符號。然後,要麼: 識別符號後面的每個字將僅由小寫字母組成 識別符號後面的每個字將僅由數字組成 我們將這兩種日誌分別稱為字母日誌和數字日誌。保證每個日誌在其識
Leetcode 10:正則表示式匹配(最詳細的解法!!!)
給定一個字串 (s) 和一個字元模式 (p)。實現支援 '.' 和 '*' 的正則表示式匹配。 '.' 匹配任意單個字元。 '*' 匹配零個或多個前面的元素。 匹配應該覆蓋整個字串 (s) ,而不是部分字串。 說明: s 可能為空,且只包含從 a-z 的小寫字母
Leetcode 939:最小面積矩形(最詳細的解法!!!)
給定在 xy 平面上的一組點,確定由這些點組成的矩形的最小面積,其中矩形的邊平行於 x 軸和 y 軸。 如果沒有任何矩形,就返回 0。 示例 1: 輸入:[[1,1],[1,3],[3,1],[3,3],[2,2]] 輸出:4 示例 2: 輸入:[[1,1],[1,
Leetcode 115:不同的子序列(最詳細的解法!!!)
給定一個字串 S 和一個字串 T,計算在 S 的子序列中 T 出現的個數。 一個字串的一個子序列是指,通過刪除一些(也可以不刪除)字元且不干擾剩餘字元相對位置所組成的新字串。(例如,"ACE" 是 "ABCDE" 的一個子序列,而 "AEC" 不是) 示例 1: 輸入: S
Leetcode 44:萬用字元匹配(超詳細的解法!!!)
給定一個字串 (s) 和一個字元模式 (p) ,實現一個支援 '?' 和 '*' 的萬用字元匹配。 '?' 可以匹配任何單個字元。 '*' 可以匹配任意字串(包括空字串)。 兩個字串完全匹配才算匹配成功。 說明: s 可能為空,且只包含從 a-z 的小寫字母。
Leetcode 32:最長有效括號(最詳細的解法!!!)
給定一個只包含 '(' 和 ')' 的字串,找出最長的包含有效括號的子串的長度。 示例 1: 輸入: "(()" 輸出: 2 解釋: 最長有效括號子串為 "()" 示例 2: 輸入: ")()())" 輸出: 4 解釋: 最長有效括號子串為 "()()" 解題思路
Leetcode 130:被圍繞的區域(最詳細的解法!!!)
給定一個二維的矩陣,包含 'X' 和 'O'(字母 O)。 找到所有被 'X' 圍繞的區域,並將這些區域裡所有的 'O' 用 'X' 填充。 示例: X X X X X O O X X X O X
Leetcode 53:最大子序和(最詳細的解法!!!)
給定一個整數陣列 nums ,找到一個具有最大和的連續子陣列(子陣列最少包含一個元素),返回其最大和。 示例: 輸入: [-2,1,-3,4,-1,2,1,-5,4], 輸出: 6 解釋: 連續子陣列
Leetcode 920:播放列表的數量(最詳細的解法!!!)
你的音樂播放器裡有 N 首不同的歌,在旅途中,你的旅伴想要聽 L 首歌(不一定不同,即,允許歌曲重複)。請你為她按如下規則建立一個播放列表: 每首歌至少播放一次。 一首歌只有在其他 K 首歌播放完之後
Leetcode 68:文字左右對齊(超詳細的解法!!!)
給定一個單詞陣列和一個長度 maxWidth,重新排版單詞,使其成為每行恰好有 maxWidth 個字元,且左右兩端對齊的文字。 你應該使用“貪心演算法”來放置給定的單詞;也就是說,儘可能多地往每行中放置單詞。必要時可用空格 ' ' 填充,使得每行恰好有 maxWidth 個字元。
Leetcode 944:刪列造序(超詳細的解法!!!)
給定由 N 個小寫字母字串組成的陣列 A,其中每個字串長度相等。 選取一個刪除索引序列,對於 A 中的每個字串,刪除對應每個索引處的字元。 所餘下的字串行從上往下讀形成列。 比如,有 A = ["abcdef", "uvwxyz"],刪除索引序列 {0, 2, 3},刪除後 A
Leetcode 33:搜尋旋轉排列陣列(最詳細的解法!!!)
假設按照升序排序的陣列在預先未知的某個點上進行了旋轉。 ( 例如,陣列 [0,1,2,4,5,6,7] 可能變為 [4,5,6,7,0,1,2] )。 搜尋一個給定的目標值,如果陣列中存在這個目標值,則
Leetcode 955:刪列造序 ||(超詳細的解法!!!)
給定由 N 個小寫字母字串組成的陣列 A,其中每個字串長度相等。 選取一個刪除索引序列,對於 A 中的每個字串,刪除對應每個索引處的字元。 比如,有 A = ["abcdef", "uvwxyz"],刪除索引序列 {0, 2, 3},刪除後 A 為["bef", "vyz"]。
Leetcode 954:二倍數對陣列(超詳細的解法!!!)
給定一個長度為偶數的整數陣列 A,只有對 A 進行重組後可以滿足 “對於每個 0 <= i < len(A) / 2,都有 A[2 * i + 1] = 2 * A[2 * i]” 時,返回 true;否則,返回 false。 示例 1: 輸入:[3,1,3,6] 輸
Leetcode 933:最近的請求次數(最詳細的解法!!!)
寫一個 RecentCounter 類來計算最近的請求。 它只有一個方法:ping(int t),其中 t 代表以毫秒為單位的某個時間。 返回從 3000 毫秒前到現在的 ping 數。 任何處於 [t
Leetcode 131:分割回文串(最詳細的解法!!!)
給定一個字串 s,將 s 分割成一些子串,使每個子串都是迴文串。 返回 s 所有可能的分割方案。 示例: 輸入: "aab" 輸出: [ ["aa","b"], ["a","a","b"] ] 解題思路 這個問題和前面的 Leetcode 93:復原IP地址