배열 내의 어느 숫자에 대해 그 왼쪽의 숫자들은 더 작고, 오른쪽의 숫자들은 더 큰 숫자들을 찾아보자.
BST 2개를 만들어서 서로 주고 받는다 >> O(NlogN)
저번에 사용했던 min(max) 값 추적할 수 있는 스택을 사용하면..!!
O(N) 알고리즘을 얻을 수 있다.
재귀적으로 해결 가능하다고 합니다
FindElement(int[] arr, int MaxTillNow, int currentIndex)
{
if(currentIndex == 0)
{
return FindElement(arr, arr[currentIndex], currentIndex + 1);
}
if(currentIndex == arr.Length-1)
{
return arr[currentIndex];
}
int minTillNow = FindElement(arr, Math.Max(MaxTillNow, arr[currentIndex]), currentIndex + 1)
if(arr[currentIndex] > MaxTillNow && arr[currentIndex] < minTillNow)
{
Console.WriteLine(arr[currentIndex]);
}
return Math.Min(minTillNow, arr[currentIndex]);
}
https://www.careercup.com/question?id=5738269695279104
다시 생각해 보니 쉬운 문제기도 하네.
각 점에 대해 그 점까지의 min과 max 값을 계산할 수 있으니까, 그걸 preprocessing 해서, 값이 맞으면 출력하는 방식으로 하면 O(N)이 되겠다.
각 점까지의 min과 max preprocessing은 제법 신박하네.
'Programming Problems > Arrays' 카테고리의 다른 글
같은 길이의 증가 배열이 있을때, K번째로 작은 원소합 구하기 Q (0) | 2018.04.22 |
---|---|
2차원 행렬에서 0의 갯수 세기 Q (0) | 2018.04.22 |
주어진 배열 패턴대로 배열 정렬하기 (0) | 2018.04.22 |
배열에서 주어진 값 보다 크면서 최소 길이인 부분배열 구하기 (0) | 2018.04.22 |
배열에서 자신보다 오른쪽에 있으면서 더 큰 원소의 갯수 중 최댓값 찾기 (0) | 2018.04.22 |