class Solution:
def search(self, nums: List[int], target: int) -> int:
if target in nums:
return nums.index(target)
else:
return -1
class Solution:
def search(self, nums: List[int], target: int) -> int:
try:
return nums.index(target)
except ValueError:
return -1
class Solution:
def search(self, nums: List[int], target: int) -> int:
idx = bisect.bisect_left(nums, target)
if idx < len(nums) and nums[idx] == target:
print(idx)
return idx
else:
return -1
class Solution:
def search(self, nums: List[int], target: int) -> int:
result = 0
left, right = 0, len(nums)-1
while left <= right:
mid = (left+right) // 2
if nums[mid] > target:
right = mid - 1
elif nums[mid] < target:
left = mid + 1
else:
return mid
return -1
class Solution:
def search(self, nums: List[int], target: int) -> int:
def bs(left, right):
if left <= right:
mid = (left + right) // 2
print(left, right, mid)
if nums[mid] > target:
return bs(left, mid - 1)
elif nums[mid] < target:
return bs(mid + 1, right)
else:
return mid
return -1
return bs(0, len(nums)-1)
속도 : bisect나 반복문이 젤 빠르다.
index()도 빠르다고 볼 수 있지만,
nums의 크기가 커지고 target이 후반부에 있을 때 index()는 매우 느려진다.
index()는 앞에서부터 차례로 찾기 때문에 최악의 경우 O(n)이 된다.
뒤에 위치한 target일수록 검색 속도가 느려진다.
반면 이진 검색은 항상 O(logn)이다.
따라서 bisect는 삽입 지점을 찾아주는 메소드지만 위치를 검색할 때도 bisect를 사용할 줄 알아야 한다.