leetcode 704. 이진 검색(파이썬)

제안이 도착했습니다. 친구를 찾아 픽업하세요! 2022년 봄학기 채용 체크인 이벤트에 참여하고 있습니다. 자세한 이벤트 내용 을 보려면 클릭하세요.

설명하다

오름차순으로 정렬된 정수 배열 nums와 정수 대상이 주어지면 대상을 nums로 검색하는 함수를 작성하십시오. 대상이 존재하는 경우 해당 인덱스를 반환합니다. 그렇지 않으면 -1을 반환합니다.

런타임 복잡도가 O(log n)인 알고리즘을 작성해야 합니다.

예 1:

Input: nums = [-1,0,3,5,9,12], target = 9
Output: 4
Explanation: 9 exists in nums and its index is 4
复制代码

예 2:

Input: nums = [-1,0,3,5,9,12], target = 2
Output: -1
Explanation: 2 does not exist in nums so return -1
复制代码

메모:

1 <= nums.length <= 10^4
-10^4 < nums[i], target < 10^4
All the integers in nums are unique.
nums is sorted in ascending order.
复制代码

구문 분석

질문의 의미에 따라 오름차순으로 정렬된 정수 배열 nums와 정수 대상이 주어지면 대상을 nums로 검색하는 함수를 작성하십시오. 대상이 있으면 해당 인덱스가 반환됩니다. 그렇지 않으면 -1을 반환합니다. 제목은 O(log n) 런타임 복잡성을 가진 알고리즘을 작성해야 한다고 분명히 명시했습니다.

"배열", "정렬", "검색", "대상", "O(log n) 시간 복잡도" 주제의 키워드를 보면 이 질문은 제목이 "이진 검색 ". 그렇다면 솔루션은 매우 명확합니다. 즉, 이진 검색 방법을 사용하여 문제를 해결하는 것입니다. 아이디어는 간단합니다.

  • 두 개의 포인터 i와 j를 초기화하여 숫자의 머리와 꼬리를 각각 가리킵니다.
  • while 루프를 수행하고 중간 위치 mid = (i + j) // 2를 찾은 다음 비교하여 nums[mid]가 target과 같으면 대상을 찾고 인덱스를 직접 반환할 수 있습니다. [mid]가 목표보다 크면 목표가 전반부에 있을 수 있음을 의미하므로 j에 mid-1을 할당해야 합니다. nums[mid]가 목표보다 작으면 목표가 후반부이므로 mid + 1을 i에 할당해야 합니다.
  • i>j까지 루프, 찾을 수 없음을 의미합니다. -1을 직접 반환하십시오.

시간 복잡도는 O(log n)이고 공간 복잡도는 O(1)입니다.

답변

class Solution(object):
    def search(self, nums, target):
        i = 0
        j = len(nums) - 1
        while i <= j:
            mid = (i + j) // 2
            if nums[mid] == target:
                return mid
            elif nums[mid] > target:
                j = mid - 1
            else:
                i = mid + 1
        return -1	
复制代码

작업 결과

Runtime: 279 ms, faster than 41.48% of Python online submissions for Binary Search.
Memory Usage: 14.6 MB, less than 78.69% of Python online submissions for Binary Search.
复制代码

원본 제목 링크

leetcode.com/problems/bi…

당신의 지원은 나의 가장 큰 동기입니다

추천

출처juejin.im/post/7079217690295943205