from collections import defaultdict
class Solution:
def twoSum(self, numbers: List[int], target: int) -> List[int]:
for i, num in enumerate(numbers):
ex = target - num
idx = bisect.bisect_left(numbers, ex, i+1)
if idx < len(numbers) and numbers[idx] == ex:
return [i+1, idx+1]
Runtime: 147 ms
bisect.bisect_left(list, target, lo=0, hi=len(list)
from collections import defaultdict
class Solution:
def twoSum(self, numbers: List[int], target: int) -> List[int]:
for i, num in enumerate(numbers):
ex = target - num
left, right = i+1, len(numbers)-1
while left <= right:
mid = (left+right) // 2
if ex > numbers[mid]:
left = mid + 1
elif ex < numbers[mid]:
right = mid - 1
else:
return i+1, mid+1
Runtime: 198 ms
mid = (left + right) // 2
1) 슬라이싱 남용
from collections import defaultdict
class Solution:
def twoSum(self, numbers: List[int], target: int) -> List[int]:
for i, num in enumerate(numbers):
ex = target - num
idx = bisect.bisect_left(numbers[i+1:], ex)
if idx < len(numbers[i+1:]) and numbers[i+1:][idx] == ex:
return [i+1, idx+i+2]
Runtime: 5500 ms
엄청난 런타임
2) 변수에 저장해서 한 번만 슬라이싱하게 슬라이싱 최소화
from collections import defaultdict
class Solution:
def twoSum(self, numbers: List[int], target: int) -> List[int]:
for i, num in enumerate(numbers):
ex = target-num
nums = numbers[i+1:]
idx = bisect.bisect_left(nums, ex)
if idx < len(nums) and nums[idx] == ex:
return [i+1, idx+i+2]
Runtime: 2428 ms
1) 보다 반으로 줄었지만 여전히 엄청난 런타임.
테스트 케이스의 입력값이 매우 커서 슬라이싱에서 속도 저하가 발생하는 것 같다.
슬라이싱이 아무리 빠르더라도 남용 금지~!