3日坊主を乗り切るんだ!
問題へのリンク
https://leetcode.com/problems/median-of-two-sorted-arrays/
問題を解く前に
- 中央値
中央値 - Wikipedia
中央値について一部誤解していたみたい。数字が偶数個の場合は算術平均を取るのだった。
log(n) は 2の対数ということで、計算量O(log (m+n))ということはm+nが16なら2の4乗だから4ループで処理できるようにということか。
解き方を考えてみる
計算量の制約があるので、半分に切っていくようなやり方がよさそう。これはバイナリサーチ(2分探索)という方法。
しかし配列が2つあるので単純に処理する方法が思いつかない。例えば[1,2,3,4], [5,6,7,8]のような配列の場合はどう考えればいいんだろう?
わからずじまいなので、とりあえずリニアサーチ(線形探索)で処理するコードを書いた。
解答
# @param {Integer[]} nums1 # @param {Integer[]} nums2 # @return {Float} def find_median_sorted_arrays(nums1, nums2) total_size = nums1.size + nums2.size is_even = total_size % 2 == 0 ? true : false if is_even medium_index = total_size / 2 else medium_index = total_size / 2 + 1 end count = 0 index1 = 0 index2 = 0 medium = 0 tmp = 0 while count <= medium_index do if nums1.size == index1 tmp = nums2[index2] index2 = index2 + 1 elsif nums2.size == index2 tmp = nums1[index1] index1 = index1 + 1 elsif nums1[index1] > nums2[index2] tmp = nums2[index2] index2 = index2 + 1 else tmp = nums1[index1] index1 = index1 + 1 end count = count + 1 if count == medium_index if is_even if nums1.size == index1 medium = (tmp.to_f + nums2[index2].to_f) / 2 elsif nums2.size == index2 medium = (tmp.to_f + nums1[index1].to_f) / 2 elsif nums1[index1] > nums2[index2] medium = (tmp.to_f + nums2[index2].to_f) / 2 else medium = (tmp.to_f + nums1[index1].to_f) / 2 end else medium = tmp.to_f end end end return medium end
解説の理解と正解の写経は後日やろう。