leetCode每日十題 堆(難度 中等)

2021-10-24 09:39:23 字數 3553 閱讀 1342

}}這是我最初的想法,時間超時了,當然很容易想到另一種方法。後面的數是前面某乙個數的2,3,5倍。因為之前沒用過堆,這裡就當堆入門了,直接學習題解的方法。

演算法:預計算1690個醜數:

初始化預計算用到的陣列nums,堆heap和雜湊表seen跟蹤在堆**現過的元素,避免重複。

迴圈計算醜數:彈出堆中最小的數字k並新增到陣列nums中。若2k.3k,5k不存在雜湊表中,則將其新增到棧中並更新雜湊表。

返回在陣列中預先計算好的醜數。

giao了,這些簡單題都寫不來,這真的是用堆就可以解決的嘛,雖然思路很清晰,但實現起來太麻煩了,看到題解才發現,原來好多功能是可以直接呼叫庫函式的呀。。。哭了。但話說回來,題解這個解法確實巧妙,用雜湊表來記錄每個單詞出現次數,用優先順序佇列來實現單調堆,同時控制堆大小,明白了,之後的這些題會用到很多的資料結構。。。

class

solution

//小頂堆,相同頻率下,字母順序高的在前,方便入棧

priorityqueue

queue=

newpriorityqueue

<

>

((o1,o2)

->

else})

;//維持topk頻率的單詞

看完題目,感覺還行,但動不了手。。。直到看到題解,我人都傻了!下面的**,如果不看注釋,能看懂嘛(我把我能寫的注釋都寫上去了。。)

class

solution);

//以該點為起點,加入邊的資訊(包括終點資訊和邊的長度)。

} dist =

newhashmap()

;for

(int node =

1; node <= n;

++node)

dist.

put(node, integer.max_value)

;//初始化從出發點到每個點的最短路徑

dist.

put(k,0)

;//出發點到自己本身的距離為0

boolean

seen =

newboolean

[n+1];

//標記該頂點是否已經走過

while

(true)}

if(candnode <0)

break

;//如果所有點都走過,則跳出while

seen[candnode]

=true

;//標記該點已經走過

if(graph.

containskey

(candnode)

)for

(int

info: graph.

get(candnode)

)//找出所有以該點為出發點的邊

dist.

put(info[0]

, math.

min(dist.

get(info[0]

), dist.

get(candnode)

+ info[1]

));//更新從出發點到該點的最短距離

原來二分法也可以在圖形中體現並運用出來,漲知識了。這種矩陣的題,我們雖然能歸納出:每個數字都大於它左上角的所有數字,小於右下角,其它象限大小不知。但我是真沒想到可以用二分法做,哎。。。儘管告訴我是二分法,我也想不到可以這樣使用,佩服,佩服!

}}

總算是學以致用了一回,主要還是題目簡單,用其他方法一樣可以很快寫出來,只不過這次用的是今天學的方法,強行裝了波b。

感覺堆題的難度和棧的題目不是乙個層次的。。。。雖然開始寫的幾個題都很蒙,但之後也是適應了這些手法,並成功運用這些手法解決了乙個簡單題??!總之,收穫頗豐,打擊頗大!每日打卡第六天,以下圖為證。

leetCode每日十題 棧(難度 困難)

因為寫的十棧裡面的題目,所以剛開始在想用棧來寫的時候,是真的一點思路沒有。琢磨著各種可以取到高分的情況,發現那是一環扣著一環,每次決定都受之後分數序列的影響,既然如此,便想到用遞迴來寫 呸,看題解的 說實話,遞迴這東西是真的巧妙啊,你不用去討論如何才能取最大,你只需要告訴計算機,我就是要去最大,然後...

LeetCode每日十題 棧(難度 中等)二

挺有意思的一道題目,上面是我的最初想法,很明顯時間超時了,待我再想想。好吧,我是廢物!大佬思路 我們首先考慮啊a i min j 如果不成立,那麼我們要跳過這個a j 否則我們將棧頂的元素依次出棧,直到棧頂元素stack top 滿足stack top min j 在這之後,我們可以確定棧中的所有元...

leetCode每日十題 棧(難度 中等)三

雖然是個基礎題,但寫出來還是略有成就感的,重在思考過程。剛開始是打算用兩個棧,乙個棧用來記錄括號,乙個用來記錄分數,但最後發現,兩個棧向互受到牽制,所以必須合成乙個棧,考慮到分數是整數,符號是字元型,要想合成乙個棧,則可考慮將符號用特殊數字代替,顯然這裡的分數都是正的,所以用 1來表示左括號。遍歷字...