> Java > java지도 시간 > 본문

고급 바이너리 Scarch를 사용하는 방법은 무엇입니까?

王林
풀어 주다: 2024-08-31 18:30:37
원래의
346명이 탐색했습니다.

How to use Advanced Binary Scarch ?

왜 그리고 어떻게?

내가 감소하지 않는 순서로 정렬된 주어진 정수 배열에서 주어진 목표 값의 시작 위치와 끝 위치를 찾는 leetcode에 대한 질문을 해결하는 동안. 따라서 단순 바이너리 스카치를 사용하여 배열에서 대상 요소의 시작과 끝을 반환하는 것은 불가능했습니다. 왜냐하면 해당 요소의 첫 번째, 끝 또는 중간이 될 수 있는 첫 번째 대상 요소를 찾은 인덱스만 반환하기 때문입니다. 그래서 우리는 Double Binary Scarch를 사용하는데, 그 방법은 다음과 같습니다...

접근하다

  1. 첫 번째 이진 검색:

    • 이진 검색을 수행하여 대상의 마지막 항목을 찾습니다.
    • 0에서 si(시작 인덱스)로 시작하고 nums.length - 1에서 ei(끝 인덱스)로 시작합니다.
    • 가운데 요소 nums[mid]가 목표보다 작으면 시작 인덱스 si를 mid + 1로 이동하여 오른쪽 절반에서 검색합니다.
    • 목표보다 큰 경우 종료 인덱스 ei를 mid - 1로 이동하여 왼쪽에서 검색합니다.
    • nums[mid]가 대상과 같은 경우 res[1]을 mid(범위의 현재 끝)로 설정하고 오른쪽 절반(si = mid + 1)에서 계속 검색하여 마지막 항목을 찾습니다.
  2. 2차 이진 검색:

    • 다른 이진 검색을 수행하여 대상의 첫 번째 발생을 찾습니다.
    • si를 0으로, ei를 nums.length - 1로 재설정합니다.
    • 이전과 비슷한 접근 방식을 따르지만 nums[mid]가 목표와 같으면 res[0]을 mid(범위의 현재 시작)로 설정하고 왼쪽 절반(ei = mid - 1)에서 계속 검색하여 첫 번째 항목을 찾습니다.
  3. 반품 결과:

    • 결과 배열 res에는 대상 값의 시작 및 끝 인덱스가 포함됩니다.

복잡성

  • 시간 복잡도:

    • 첫 번째와 마지막 항목에 대한 이진 검색에는 각각 O(log n) 시간이 걸립니다. 두 번의 이진 검색을 수행하므로 전체 시간 복잡도는 O(log n)입니다.
  • 공간 복잡성:

    • O(1) 변수에 고정된 추가 공간을 사용하고 있기 때문입니다.

암호

class Solution {
    public int[] searchRange(int[] nums, int target) {
        int ei = nums.length - 1;
        int si = 0;
        int[] res = {-1, -1};  // Initialize result array

        // First binary search to find the last occurrence
        while (si <= ei) {
            int mid = si + (ei - si) / 2;
            if (target < nums[mid]) {
                ei = mid - 1;
            } else if (target > nums[mid]) {
                si = mid + 1;
            } else {
                res[1] = mid;  // Update end index
                si = mid + 1;  // Search in the right half
            }
        }

        // Reset the pointers for the second binary search
        si = 0;
        ei = nums.length - 1;

        // Second binary search to find the first occurrence
        while (si <= ei) {
            int mid = si + (ei - si) / 2;
            if (target < nums[mid]) {
                ei = mid - 1;
            } else if (target > nums[mid]) {
                si = mid + 1;
            } else {
                res[0] = mid;  // Update start index
                ei = mid - 1;  // Search in the left half
            }
        }

        return res;  // Return the result array
    }
}
로그인 후 복사

위 내용은 고급 바이너리 Scarch를 사용하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿