K個數(shù)、K個點菠秒、K個元素疙剑,3K堆排序,類比三解題践叠!

面試題17.14.最小K個數(shù)

https://leetcode-cn.com/problems/smallest-k-lcci/solution/mian-shi-ti-1714zui-xiao-kge-shu-ji-chu-k9jd8/

難度:中等

題目:

設(shè)計一個算法言缤,找出數(shù)組中最小的k個數(shù)。以任意順序返回這k個數(shù)均可禁灼。

提示:

  • 0 <= len(arr) <= 100000
  • 0 <= k <= min(100000, len(arr))

示例:

輸入: arr = [1,3,5,7,2,4,6,8], k = 4
輸出: [1,2,3,4]

分析

這道題之所以定義為堆排序類型題管挟,就是因為可以任意順序返回。 這里推排序有兩種思路:

  1. 小根堆:每次獲取的數(shù)據(jù)都無腦入堆弄捕,然后最終將前K個數(shù)字返回
  2. 大根堆:僅維護K個長度的堆僻孝,由于python沒有,需要入賦值守谓,如果當前的數(shù)大于heap[0]皮璧,則堆頂出堆,當前數(shù)入堆分飞,最終返回睹限。

至于 return sorted(arr)[:k] 的寫法譬猫,面試時候不怕被打羡疗,你就這么寫。

解題:

import heapq

class Solution:
    def smallestK(self, arr, k):
        if k == 0:
            return []
        hq = []
        for i in arr:
            if len(hq) < k:
                heapq.heappush(hq, -i)
            else:
                if hq[0] < -i:
                    heapq.heappop(hq)
                    heapq.heappush(hq, -i)
        return [-i for i in hq]

347.前K個高頻元素

https://leetcode-cn.com/problems/top-k-frequent-elements/solution/347qian-kge-gao-pin-yuan-su-nei-zhi-han-zlfi7/

難度:中等

題目:

給你一個整數(shù)數(shù)組 nums 和一個整數(shù) k 叨恨,請你返回其中出現(xiàn)頻率前 k 高的元素柳刮。你可以按 任意順序 返回答案。

提示:

  • 1 <= nums.length <= 10 ^ 5
  • k 的取值范圍是 [1, 數(shù)組中不相同的元素的個數(shù)]
  • 題目數(shù)據(jù)保證答案唯一秉颗,換句話說痢毒,數(shù)組中前 k 個高頻元素的集合是唯一的

示例:

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

示例 2:
輸入: nums = [1], k = 1
輸出: [1]

分析

遇到重復數(shù)字求頻率蚕甥,首先要想到Counter計數(shù)原則哪替,將當前的數(shù)組轉(zhuǎn)換為hash表 num:frequency 的類型然后再做操作。
即: dic = collections.Counter(nums)

分享兩種方法(雖然面試官更希望你寫第二種菇怀,但如果同時寫出第一種凭舶,能展示出你對基礎(chǔ)模塊的掌握度):

1.sorted方法

使用sorted自帶的排序和列表切片后返回爱沟,可以壓縮到一行代碼

2.堆排序

這道題提及了任意順序返回均可,那就可以通過使用堆的方法來解決了身冀。這道題使用小根堆很方便蜂大。

類似的題目有:

面試題17.14.最小K個數(shù)

sorted解題:

from collections import Counter
class Solution:
    def topKFrequent(self, nums, k):
        return [x[0] for x in sorted(Counter(nums).items(),key = lambda x: x[1],reverse=True)[:k]]

堆排序解題:

from collections import Counter
import heapq

class Solution:
    def topKFrequent(self, nums, k):
        dic = Counter(nums)
        hp = []
        for num, req in dic.items():
            if len(hp) < k:
                heapq.heappush(hp, (req, num))
            else:
                if req > hp[0][0]:
                    heapq.heappop(hp)
                    heapq.heappush(hp, (req, num))
        return [x[1] for x in hp]

973.最接近原點的K個點

https://leetcode-cn.com/problems/k-closest-points-to-origin/solution/973zui-jie-jin-yuan-dian-de-kge-dian-pyt-4jro/

難度:中等

題目:

我們有一個由平面上的點組成的列表 points。需要從中找出 K 個距離原點 (0, 0) 最近的點奶浦。

(這里,平面上兩點之間的距離是歐幾里德距離隙咸。)

你可以按任何順序返回答案成洗。除了點坐標的順序之外,答案確保是唯一的瓶殃。

提示:

  • 1 <= K <= points.length <= 10000
  • -10000 < points[i][0] < 10000
  • -10000 < points[i][1] < 10000

示例:

示例 1:

輸入:points = [[1,3],[-2,2]], K = 1
輸出:[[-2,2]]
解釋: 
(1, 3) 和原點之間的距離為 sqrt(10),
(-2, 2) 和原點之間的距離為 sqrt(8)基矮,
由于 sqrt(8) < sqrt(10)冠场,(-2, 2) 離原點更近。
我們只需要距離原點最近的 K = 1 個點碴裙,所以答案就是 [[-2,2]]点额。
示例 2:

輸入:points = [[3,3],[5,-1],[-2,4]], K = 2
輸出:[[3,3],[-2,4]]
(答案 [[-2,4],[3,3]] 也會被接受莺琳。)

分析

遇到求前K的題目还棱,內(nèi)置的sorted和堆排序無腦安排上就對了芦昔,類似的題目有:

這道題同樣的,我們使用堆排序(大根堆)來完成解題咕缎,維護一個K大的堆,然后每次判斷距離是否比堆頂?shù)臄?shù)字大焙蹭。
如果比堆頂數(shù)字大嫂伞,彈出堆頂,將當前距離及點信息以列表方式入堆即可帖努。

解題:

import heapq


class Solution:
    def kClosest(self, points, k):
        hp = []
        for point in points:
            distance = sum(map(lambda x: abs(x ** 2), point))
            if len(hp) < k:
                heapq.heappush(hp, [-distance, point])
            else:
                if -distance > hp[0][0]:
                    heapq.heappop(hp)
                    heapq.heappush(hp, [-distance, point])
        return [point for distance, point in hp]

歡迎關(guān)注我的公眾號: 清風Python拼余,帶你每日學習Python算法刷題的同時,了解更多python小知識匙监。

我的個人博客:https://qingfengpython.cn

力扣解題合集:https://github.com/BreezePython/AlgorithmMarkdown

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末亭姥,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子达罗,更是在濱河造成了極大的恐慌,老刑警劉巖绍载,帶你破解...
    沈念sama閱讀 222,946評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件滔蝉,死亡現(xiàn)場離奇詭異塔沃,居然都是意外死亡阳谍,警方通過查閱死者的電腦和手機螃概,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來训貌,“玉大人冒窍,你說我怎么就攤上這事∽” “怎么了挫以?”我有些...
    開封第一講書人閱讀 169,716評論 0 364
  • 文/不壞的土叔 我叫張陵檩奠,是天一觀的道長附帽。 經(jīng)常有香客問我,道長整胃,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,222評論 1 300
  • 正文 為了忘掉前任爪模,我火速辦了婚禮荚藻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘共郭。我一直安慰自己疾呻,他們只是感情好,可當我...
    茶點故事閱讀 69,223評論 6 398
  • 文/花漫 我一把揭開白布尉咕。 她就那樣靜靜地躺著璃岳,像睡著了一般年缎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蜕该,一...
    開封第一講書人閱讀 52,807評論 1 314
  • 那天洲鸠,我揣著相機與錄音,去河邊找鬼绢淀。 笑死袜匿,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的居灯。 我是一名探鬼主播,決...
    沈念sama閱讀 41,235評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼义锥,長吁一口氣:“原來是場噩夢啊……” “哼岩灭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起噪径,我...
    開封第一講書人閱讀 40,189評論 0 277
  • 序言:老撾萬榮一對情侶失蹤找爱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后车摄,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,712評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡变屁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,775評論 3 343
  • 正文 我和宋清朗相戀三年意狠,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片闷板。...
    茶點故事閱讀 40,926評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蛔垢,靈堂內(nèi)的尸體忽然破棺而出迫悠,到底是詐尸還是另有隱情,我是刑警寧澤艺玲,帶...
    沈念sama閱讀 36,580評論 5 351
  • 正文 年R本政府宣布鞠抑,位于F島的核電站,受9級特大地震影響搁拙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜酪碘,卻給世界環(huán)境...
    茶點故事閱讀 42,259評論 3 336
  • 文/蒙蒙 一盐茎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧字柠,春花似錦、人聲如沸钦幔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,750評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拐纱。三九已至,卻和暖如春揍庄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蚂子。 一陣腳步聲響...
    開封第一講書人閱讀 33,867評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蒂破,地道東北人别渔。 一個月前我還...
    沈念sama閱讀 49,368評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像哎媚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子稻据,可洞房花燭夜當晚...
    茶點故事閱讀 45,930評論 2 361

推薦閱讀更多精彩內(nèi)容