문제 링크

요약

  • 전체가 정렬되어 있지 않아도 binary search 를 고민해 보자.

최종

  • 기본적인 idea 는 rotate 되어 있다면 반갈죽했을때 한쪽은 정렬되어 있고 반대쪽은 정렬되어있지 않다는 것을 이용하는 것이다.
    • 만약 둘 다 정렬되어 있다면 전체가 다 정렬되어있는 것이니 그냥 index 0 을 반환하면 된다.
  • 이를 이용해 일반적인 binary search 처럼 접근하되, 반갈죽했을 때 정렬되어있지 않은 곳 (즉, 가운데 값보다 왼쪽 끝이 더 크다면 왼쪽 절반, 오른쪽 끝이 더 작다면 오른쪽 절반) 으로 좁혀나가면 된다.
int findMin(int* nums, int numsSize) {
	short left = 0;
	short right = numsSize - 1;
 
	while (left + 1 != right)
	{
		short mid = (left + right) >> 1;
 
		if (nums[left] > nums[mid])
			right = mid;
 
		else if (nums[mid] > nums[right])
			left = mid;
 
		else
			break;
	}
 
	return nums[left] < nums[right] ? nums[left] : nums[right];
}
  • 근데 결과를 보면 메모리 사용량이 높다고 나온다. 이건 거의 사기라고 봐야지
    • 뭐 assembly 를 사용하거나 그랬겠지; 여기서 더 이상 메모리 사용량을 줄이는 건 도대체 어떻게 했는지 모르겠다.