leetcode 34. 정렬 배열 에서 요소 의 첫 번 째 와 마지막 위 치 를 찾 습 니 다 (자바 버 전)

2150 단어
제목 설명 (제목 난이도, 중간)
오름차 순 으로 배 열 된 정수 배열 nums 과 목표 치 target 를 지정 합 니 다.주어진 목표 값 이 배열 의 시작 위치 와 끝 위 치 를 찾 습 니 다.
당신 의 알고리즘 시간 복잡 도 는 반드시 O (log n) 등급 이 어야 합 니 다.
배열 에 목표치 가 존재 하지 않 으 면 되 돌려 줍 니 다 [-1, -1].
예시 1:
입력: nums = [5, 7, 7, 8, 8, 10], target = 8 출력: [3, 4]
예시 2:
입력: nums = [5, 7, 7, 8, 8, 10], target = 6 출력: [- 1, - 1]
문제 풀이
이런 문 제 는 아주 좋 습 니 다. 만약 에 이 문제 가 없 으 면 제 가 실제 에서 이 문 제 를 만나면 생각 은 2 분 에 같은 요소 중의 하 나 를 찾 은 다음 에 각각 앞으로, 뒤로 차례대로 일치 하여 첫 번 째 와 마지막 위 치 를 찾 을 때 까지 하 는 것 이 라 고 생각 합 니 다.그러나 이렇게 하면 최 악의 경우 알고리즘 의 시간 복잡 도 는 O (n) 이다.한편, 문 제 는 알고리즘 시간 복잡 도 는 반드시 O (log n) 등급 이 어야 하기 때문에 자신 을 강요 하면 다음 과 같은 알고리즘 이 생 긴 다.알고리즘 의 기본 구 조 는 물론 2 분 으로 찾 아야 합 니 다. 다만 첫 번 째 2 분 으로 찾 은 후에 첫 번 째 로 포 지 셔 닝 한 목표 요소 의 양쪽 을 각각 2 분 으로 찾 아 목표 요소 의 경 계 를 찾 아야 합 니 다.알고리즘 사상 도 간단 하지만 인 코딩 실현 에 있어 어느 정도 어려움 이 있다.
class Solution {
    public int[] searchRange(int[] nums, int target) {
        if(nums == null || nums.length == 0) return new int[]{-1, -1};
        int mid = 0, low = 0, high = nums.length-1;
        while(low <= high){
            mid = (low+high) >> 1;
            if(nums[mid] == target) break;
            else if(nums[mid] < target) low = mid + 1;
            else high = mid - 1;
        }
        if(low > high) return new int[]{-1, -1};
        int[] result = new int[2];
        if(nums[low] <= target) result[0] = BSR(nums, low, mid, target)[0];
        if(nums[high] >= target) result[1] = BSR(nums, mid, high, target)[1];
        return result;
    }
    private int[] BSR(int[] a, int low, int high, int target){
        int mid;
        while(low <= high){
            mid = (low+high) >> 1;
            if(a[mid] == target){
                if(a[low] == a[high]) return new int[]{low, high};
                if(a[low] < target) return BSR(a, low+1, mid, target);
                if(a[high] > target) return BSR(a, mid, high-1, target);
            }
            else if(a[mid] < target) low = mid + 1;
            else high = mid - 1;
        }
        return new int[]{-1, -1};
    }
}

좋은 웹페이지 즐겨찾기