LoginSignup
0
0

More than 1 year has passed since last update.

Rubyアルゴリズム(Find the Highest Altitude)

Last updated at Posted at 2021-05-31

問題

There is a biker going on a road trip. The road trip consists of n + 1 points at different altitudes. The biker starts his trip on point 0 with altitude equal 0.

You are given an integer array gain of length n where gain[i] is the net gain in altitude between points i​​​​​​ and i + 1 for all (0 <= i < n). Return the highest altitude of a point.

Example 1:

Input: gain = [-5,1,5,0,-7]
Output: 1
Explanation: The altitudes are [0,-5,-4,1,1,-6]. The highest is 1.
Example 2:

Input: gain = [-4,-3,-2,-1,4,3,2]
Output: 0
Explanation: The altitudes are [0,-4,-7,-9,-10,-6,-3,-1]. The highest is 0.

Constraints:

n == gain.length
1 <= n <= 100
-100 <= gain[i] <= 100

私の回答

def largest_altitude(gain)
    alt = 0
    hi = [0]
    gain.each do |g|
        hi << alt += g
    end
    hi.max
end

無事Acceptedです。

解くことよりも、よりシンプルに書くことの方が難しいです。もっとシンプルに書ける気しかしない。
今回も考え方を書いていきます。

alt = 0
hi = [0]

初期値を入れておきます。
altitudeはスタート地点の高度0、highestには移動していった中で一番高度の高かったポイントを入れます。
配列に0を入れているのは、高度マイナスの場所しか通過しなかった場合、スタート地点が最も高度が高いからです。
配列に入れて最終的に

hi.max

で一番大きい数値を取り出しています。

gain.each do |g|
    hi << alt += g
end

その為にhighestに通過した高度をどんどん入れていきます。

以上です。だいたい同じこと解き方ばかりするようになってきてしまった。
次は新しいメソッドを使う問題を解きたいです。

もっと簡単に書けた!

def largest_altitude(gain)
    alt = 0
    gain.unshift(0).map{ alt += _1 }.max
end

これでAcceptedです。すごく短くなりました!
というのも、コメントで

alt = 0
gain.map{ alt += _1 }

で再起的な処理を書けるのでは?と教えていただきました。なるほど〜!

_1は|g|のように明示的なブロック変数を記述する代わりに、連番となる仮引数(受け取り側)として記述するものです。
ちなみにeachの返り値は元の配列、mapの返り値は処理後の配列になるようです。
返り値が配列なので、そもそも初期値を入れた配列の準備も不要になります。

alt = 0
gain.map{ alt += _1 }.max

なので直接gainから最大値を取得できるようになりました。かなりスッキリ!
ただこれだと、マイナスの数値しか配列に入らなかった場合に、初期値の0を返したい場合にうまくいかないので、もう最初からgainの頭に0を入れ込んでしまいます。

gain.unshift(0)

これで配列gainの先頭に0が入ります。あとは順番に足していくだけ。
終了です。

最近実務でもmapが使われているのをよく見るので、理解の為に自分でも積極的に使っていくようにしたいと思います。
どうしても明示的にブロック変数を記述してのeach文に(わかりやすいので)逃げがちですが、それではいつまでも進歩がないので。。

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0