inohilog

/var/log/inohiro.log

21. Merge two sorted lists

2つのソートされた Linked List が与えられて、マージした新しい Linked List を返す。解けず。

解説を読んだところ、再帰でやるやつと、while で最後のノードまで読みながらごにょごにょする方法が説明されていた。私は一度再帰でやろうとしてできず、while でごにょろうとしたが結局できず。複雑... もうちょっと余裕のあるときに見直す。

101 & 121

101. Symmetric Tree

二分木がシンメトリーになっているか調べる。木を辿るときに右側から辿る方と、左側から辿る方を両方ともやって、値が等しいか確認する。私が実装したやつだと、それぞれ完全に終わりまで調べてから、その結果が左右で等しいか確認している。解説にある方法は、辿りながら値が揃わなかったところで即時 return しているので、そっちのほうが効率的だ。もう一つの方法はQueueに next を突っ込みながら、それぞれ値を確認する。何分で解いたか忘れたが、そんなにかからなかった。

121. Best Time to Buy and Sell Stock

株価を表す数字の配列が与えられて、最大の利益を求める。解けたけど1時間ちょい掛かってしまった。消えてなくなりたい。

最初に考えたやり方は買うときの額を配列の左側から、売るときの額を配列の右側から、添字がぶつかるところまで見て最大の利益を探す。これだと NxN = N2 だけど、半分しか計算しないから全部計算するより効率的だろうと思っていた。しかし巨大な配列が与えられたときに TLE になってしまった。そもそも実行するまで O(N2) だったのに気がついてなかったのでダメだ。解く道筋を立ててからコーディングを始めることができたけど、ダメっぽいアルゴリズムには早く気が付きたい。

配列を見ながら最小値(買うべき額)と最大値(売るべき額)を更新しながら利益を計算する方法で書き直した。買う前に売れないので、買うべき額が更新されたら、売るべき額をリセットしないといけない。売るべき額は更新されても、買うべき額はリセットする必要はない。こういう感じでやれば O(N)。解説を読んだあとにコードを見返すと、添字 i, j は2つある必要はなかった。もっとエレガントに書きたい。

83. Remove Duplicates from Sorted List

25分くらい掛かったけど一発で解けた。重複してる要素はスキップするというのを数日前の問題で見ていたので、LinkedList でも同じことをやればよかった。自分の実装では新しい ListNode を繋げてそれを結果としているけど、解説では与えられたListNodeを繋ぎ変えていて、そっちのほうが良いな。

Easy の問題でも安定して解けるようになりたいので(解けるべき問題が解けないのがやばい)、このまま続ける。