1. 程式人生 > >LeetCode-347:Top K Frequent Elements(取前k個頻率最高的元素)

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 的使用方法
>>>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-347Top K Frequent Elementsk頻率最高元素

題目: 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 ElementsMedium

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 Elementspython+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地址