Conversation
| 用いた区間の種類に対し、範囲を狭めるためのロジックを、理由を理解したうえで、適切に記述できるか? | ||
| →midがtrueならright=mid, midがfalseならleft=mid+1 | ||
|
|
||
| ```python |
|
|
||
| def targetCanBeInThisInterval(left_closed, right_closed): | ||
| if nums[left_closed] <= nums[right_closed]: | ||
| return (nums[left_closed] <= target) & (target <= nums[right_closed]) |
There was a problem hiding this comment.
& | は、ビット単位での and, or という意味です。論理的な方は and or を使うのが普通です。
また、() は優先順位を変えないときにはつけないことが多いです。
(誤りではないが、(2 * 3) + 4 とは書かないことが多いのと同じ。)
Python Operator Precedence を参照です。
https://docs.python.org/3/reference/expressions.html#operator-precedence
| right = len(nums) - 1 | ||
| while left < right: | ||
| if nums[left] <= nums[right]: | ||
| right = left |
| left = mid + 1 | ||
| else: | ||
| right = mid | ||
| min = left |
There was a problem hiding this comment.
min は built-in function (組み込み関数)の中にあるので、できれば避けます。
https://docs.python.org/3/library/functions.html
(後の書き換えで built-in の min を使いたいときに混乱する、という程度の理由。)
| if min == 0: | ||
| left = 0 | ||
| right = len(nums) - 1 | ||
| elif target < nums[0]: | ||
| left = min | ||
| right = len(nums) - 1 |
| 回転の切れ目を見つけて、ソートされてる部分についてサーチする方法は賢いと思った。 | ||
| しかし、たぶん二倍くらい遅いのかな? | ||
|
|
||
| この問題でbisectを使うには、keyをうまくクラフトする必要がありそう |
There was a problem hiding this comment.
bisect_left, bisect_right のソースコードも読んでおきましょう。
https://github.com/python/cpython/blob/main/Lib/bisect.py
key のクラフトはこれです。
https://discord.com/channels/1084280443945353267/1262688866326941718/1344194431800184852
https://docs.google.com/document/d/11HV35ADPo9QxJOpJQ24FcZvtvioli770WWdZZDaLOfg/edit?tab=t.0#heading=h.427rioitx1u6
| →そのため、left=0, right=len(nums)-1から始める。 | ||
|
|
||
| 用いた区間の種類に対し、適切なループ不変条件を、理由を理解したうえで、設定できるか? | ||
| →閉区間なので、要素が一つだけになったときにそれが答えという考え方で行く。したがって、不変条件は、while left<right |
There was a problem hiding this comment.
私の場合、探索区間が閉区間ならば、探索区間が潰れるまでループを回すようにしていた(while left <= right)のですが、要素を1つにまで絞って、そこを確認すれば良いのですね。
No description provided.