한 배열 의 값 은 먼저 작은 것 에서 큰 것 으로 증가 한 후에 큰 것 에서 작은 것 으로 감소 하여 가장 큰 값 을 찾 아 냈 다.

질문:
배열 을 지정 하면 그 값 은 작은 것 에서 큰 것 으로 증가 한 후에 큰 것 에서 작은 것 으로 감소 하여 가장 큰 값 을 찾 습 니 다.
사고: 가장 쉬 운 방법 은 두 번 째 값 부터 A [i] > A [i - 1] & A [i] > A [i + 1] 을 만족 시 키 는 지 판단 하 는 것 이다. 만족 하면 i 는 그 최대 치 의 하 표 이다.이 알고리즘 의 복잡 도 는 O (n) 이다.
우 리 는 이러한 알고리즘 을 개선 할 수 있 습 니 다. 이 배열 은 순 서 를 잘 배열 한 것 이기 때문에 우 리 는 2 분 으로 찾 는 사상 을 이용 하여 최대 치 를 더욱 빠르게 찾 을 수 있 습 니 다. 시간 복잡 도 는 O (lg n) 입 니 다.
public int turningPoint(int[] A) {
		int m = A.length;
		int begin = 0;		
		int end = m - 1;		
		int tp = begin + (end - begin)/2;
		
		// the condition "tp > 0 && tp < m -1" makes sure that tp is not at the beginning or the end
		while (tp > 0 && tp < m -1) {			
			if (A[tp] > A[tp + 1] && A[tp] > A[tp -1]) {
				return tp;
			} else if (A[tp] < A[tp+1]) {
				begin = tp + 1;
				tp = begin + (end - begin)/2;
			} else {
				end = tp - 1;
				tp = begin + (end - begin)/2;
			} 			
		}
		
		return -1;
	}
전재 출처 를 밝 혀 주 십시오.http://blog.csdn.net/beiyeqingteng

좋은 웹페이지 즐겨찾기