}}這是我最初的想法,時間超時了,當然很容易想到另一種方法。後面的數是前面某乙個數的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來表示左括號。遍歷字...