Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 릿코드 파이썬
- 파이썬알고리즘
- 릿코드
- 릿코드풀이
- python Leetcode
- python priority queue
- 파이썬 알고리즘
- python xor
- 릿코드 풀기
- binary search
- 릿코드풀기
- 알고리즘풀이
- 잇츠디모
- python 릿코드
- python sorted
- 상가수익률계산기
- 파이썬 릿코드
- 파이썬릿코드풀기
- 파이썬알고리즘풀기
- 코틀린기초
- python zip_longest
- leetcode풀기
- LeetCode
- leetcode 풀기
- leetcode풀이
- 파이썬 알고리즘 풀기
- 파이썬 프로그래머스
- python 알고리즘
- 알고리즘풀기
- 파이썬릿코드
Archives
- Today
- Total
소프트웨어에 대한 모든 것
LeetCode 풀기 - 34. Find First and Last Position of Element in Sorted Array 본문
알고리즘/LeetCode
LeetCode 풀기 - 34. Find First and Last Position of Element in Sorted Array
앤테바 2022. 2. 28. 15:44반응형
34. Find First and Last Position of Element in Sorted Array
https://leetcode.com/problems/find-first-and-last-position-of-element-in-sorted-array/
문제)
솔루션1) binary search
풀이 순서:
1) 바이너리 서치로 target을 탐색
2) 찾은 target에서 왼쪽으로 인덱스를 이동하면서 동일한 target 값이 나올 때 까지 이동 (left idx)
3) 찾은 target에서 오른쪽 인덱스를 이동하면서 동일한 target 값이 나올 때 까지 이동 (right idx)
위 풀이는 결국 시간 복잡도 O(n)을 갖기 때문에 O(logn)을 만족하지 못 합니다.
class Solution:
def searchRange(self, nums: List[int], target: int) -> List[int]:
def search():
left = 0
right = len(nums)
while left < right:
mid = (left+right)//2
if nums[mid] == target:
return mid
elif nums[mid] < target:
left = mid+1
else:
right = mid
return -1
target_idx = search()
if target_idx == -1:
return [-1, -1]
# left idx
left_idx = target_idx
while left_idx > 0 and nums[left_idx-1] == target:
left_idx -= 1
# right idx
right_idx = target_idx
while right_idx < (len(nums)-1) and nums[right_idx+1] == target:
right_idx += 1
return [left_idx, right_idx]
솔루션2) binary search
discuss에 아주 멋진 솔루션이 있네요.
binary search를 조금 변형해서 원하는 target의 가장 왼쪽 idx를 찾도록 조금 변경된 코드입니다.
이것을 이용하면 target의 가장 오른쪽 idx도 동일하게 찾을 수 있습니다.
바이너리 서치를 두 번 호출하지만 시간 복잡도는 O(logn)을 만족합니다.
class Solution:
def searchRange(self, nums: List[int], target: int) -> List[int]:
def search(x):
left = 0
right = len(nums)
while left < right:
mid = (left + right) // 2
if nums[mid] < x:
left = mid + 1
else:
right = mid
return left
left = search(target)
right = search(target+1) - 1
if left <= right:
return [left, right]
return [-1, -1]
함께 보면 좋은 글:
2021.11.10 - [알고리즘/알고리즘 Basic] - [파이썬] 바이너리 서치 (이진 탐색)
반응형
'알고리즘 > LeetCode' 카테고리의 다른 글
LeetCode 풀기 - 2181. Merge Nodes in Between Zeros (0) | 2022.03.04 |
---|---|
LeetCode 풀기 - 287. Find the Duplicate Number (0) | 2022.03.02 |
LeetCode 풀기 - 64. Minimum Path Sum (0) | 2022.02.28 |
LeetCode 풀기 - 108. Convert Sorted Array to Binary Search Tree (0) | 2022.02.27 |
LeetCode 풀기 - 662. Maximum Width of Binary Tree (0) | 2022.02.27 |
Comments