Conversation
| return list(set(nums1) & set(nums2)) | ||
| ``` | ||
|
|
||
| # Step 3 |
There was a problem hiding this comment.
これは、まあ、これでいいんですが、もう少し書き方にバリエーションがあるように思います。挙げてみますか?
たとえば、追加質問で考えられるのは、「片方がとても大きくて、片方がとても小さいときには、大きい方を set にするのは大変じゃないでしょうか、特に大きいほうが sort 済みのときにはどうしますか。」とかです。
There was a problem hiding this comment.
レビュー者ですが、この視点はなかったです。たしかにこのコードだとlen(nums1)が1e8とかでlen(nums2)が空リストだと無駄な計算をすることになりますね
There was a problem hiding this comment.
ありがとうございます!
他の解き方を選択するときの気持ち?状況?みたいなものがイメージできてなかったので、状況を例示いただけたことでイメージができてとっつきやすいです。
この状況についても考えてみました。「ソートされてるということを活用して、長い方は全部みたくないから二分探索を活用したいな」みたいなことを考えながら以下のように解いてみます。
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
# nums1: とても大きくてsort済み
# nums2: とても小さい
# sort済みという状況を再現するために、nums1をsortする
nums1.sort()
intersections = []
for num in nums2:
if num in intersections:
continue
left = -1
right = len(nums1)
while right - left > 1:
middle = (left + right) // 2
if nums1[middle] == num:
intersections.append(num)
break
if nums1[middle] < num:
left = middle
else:
right = middle
return intersectionsThere was a problem hiding this comment.
そうですね。
他、両方ソートされていてとても大きければ、マージソートの変形のように書くと思います。
要するにこの問題の推定される出題意図は条件を変えたときに案がいくつか出てくるかです。
hayashi-ay
left a comment
There was a problem hiding this comment.
良いと思います。setのintersectionメソッドや他の集合演算のメソッドにも目を通しておくと良いと思います。
https://docs.python.org/3/library/stdtypes.html#frozenset.intersection
https://leetcode.com/problems/intersection-of-two-arrays/description/