find peak elements

김대익·2022년 3월 31일
0

배열이 주어졌을 때 바로 양옆 숫자보다 현재 숫자가 큰 경우,
현재 숫자의 인덱스를 리턴하시오.

  1. 자기자신과 양 옆의 값과 비교해서 max값이 자신인지 체크하는 방식, O(n) 시간복잡도
  2. 이진탐색을 이용한 방법, O(lgn)
int findPeakElem(int [] nums) {
	int left = 0;
    int right = nums.length - 1; //좌 우 인덱스 초기설정
    
    if (nums.size() <= 1) { //배열크기가 0이면 종료
    	return 0;
    }
    
    while (left < right) { //인덱스가 서로 겹칠 때 까지 반복
    	int pivot = (left + right) / 2; //이진탐색이므로 중간값을 pivot으로 갖는다
        int num = nums[pivot];
        int nextNum = nums[pivot + 1]; 
        
        if (num < nextNum) { //pivot이 오른쪽값보다 작다면 
        	left = pivot + 1; //pivot의 오른쪽에서 다시 중간값을 찾을 준비
        } else { //pivot이 오른쪽값보다 크다면 
        	right = pivot; //pivot의 왼쪽에서 다시 중간값을 찾을 준비
        }
    }
    return left;
}

0개의 댓글