https://leetcode.com/problems/search-insert-position/

algorithm の runtime は O(log n) である必要があるため、 binary search で target の数の位置を調べる。

変数 left に 0、 right に len(nums) - 1 を設定する。

(left + right) // 2 で真ん中の値が取得出来るので、 真ん中の位置を mid とする。

nums の mid の値が target なら、mid の index の値を返す。 もし、target の値が mid より大きい場合、 left を mid + 1 にする。 target の値が mid より小さい場合、 right を mid - 1 にする。

[1, 3, 5, 6] で target = 2 の場合、

[1, 3, 5, 6] l m r

targetの2 は nums[mid]より小さいので、 r の位置が、 mid - 1 のため、一番左になる。 [1, 3, 5, 6] l m
r

次のループで mid の位置が(0 + 0) // 2 で 0 になる。 target が nums[mid] より大きいので、 left の位置を +1 して右にずらす。 [1, 3, 5, 6] r l m

left が right の場所を超えたので、 この時点でループを抜け、left を return する。

class Solution:
    def searchInsert(self, nums: List[int], target: int) -> int:
        left, right = 0, len(nums) - 1

        while left <= right:
            mid = (left + right) // 2

            if target == nums[mid]:
                return mid

            if target > nums[mid]:
                left = mid + 1
            else:
                right = mid - 1
        return left