leetcode 33 - 회전 정렬 배열 검색

10713 단어 leetcode
leetcode 33 - 회전 정렬 배열 원본 링크 검색
제목 의 뜻 을 약술 하 다.
오름차 순 으로 정렬 된 배열 이 미리 알 수 없 는 한 점 에서 회전 했다 고 가정 합 니 다.(예 를 들 어 배열 [0, 1, 2, 4, 5, 6, 7] 은 [4, 5, 6, 7, 0, 1, 2] 로 변 할 수 있다.주어진 목표 값 을 검색 합 니 다. 배열 에 이 목표 값 이 존재 하면 색인 을 되 돌려 줍 니 다. 그렇지 않 으 면 - 1 을 되 돌려 줍 니 다.너 는 배열 에 중복 되 는 요소 가 존재 하지 않 는 다 고 가정 할 수 있다.당신 의 알고리즘 시간 복잡 도 는 반드시 O (log n) 등급 이 어야 합 니 다.
예시 1:
입력: nums = [4, 5, 6, 7, 0, 1, 2], target = 0 출력: 4
예시 2:
입력: nums = [4, 5, 6, 7, 0, 1, 2], target = 3 출력: - 1
문제 풀이 분석
  • 분 치 + 2 점
  •   :          ,               ,
    	                 .     ,   
    	 ;  ,           ,           .
    
         : 
    	     : S(n) = S(n/2) + log(n/2), S(1) = 1;
    		  :   n = 2^k, S(2^k) = S(2^(k-1)) + (k - 1)log29
    		  ,S(n) = O(logn * logn)
    

    참조 코드
  • java
  • class Solution {
        public int search(int[] nums, int target) {
            int left = 0;
            int right = nums.length;
            while(left < right) {
                int mid = (left + right) >> 1;
                if(nums[mid] == target) return mid;
                if(nums[mid] < nums[left]) {
                    int idx = binarySearch(nums,mid,right,target);
                    if(idx != -1) return idx;
                    right = mid;
                } else {
                    int idx = binarySearch(nums,left,mid,target);
                    if(idx != -1) return idx;
                    left = mid + 1;
                }
            }
            return -1;
        }
        
        public int binarySearch(int[] nums, int left, int right, int target) {
            int low = left;
            int top = right;
            while(low < top) {
                int mid = (low + top) >> 1;
                if(nums[mid] < target) {
                    low = mid + 1;
                } else {
                    top = mid;
                }
            }
            return (low < right && nums[low] == target) ? low : -1;
        }
    }
    

    좋은 웹페이지 즐겨찾기