나는 하나의 요소의 인덱스가,이 목록을 가지고 있고 다른 하나는 주가가 있습니다. 각 인덱스의 나는 현재 지수와 가장 가까운에 주가보다 작은 중 주식 배열에 위 또는 아래로 최소 가까운 주가를 찾을 수있다. 여기 내 코드입니다. 그것은 정확하지만, 너무 너무 느린입니다 제공 시간 제한 실행 오류 ;
public static List<Integer> predictAnswer(List<Integer> stockData, List<Integer> queries) {
List<Integer> resQuery = new ArrayList<>();
/* to show -1 if there is no such stock price */
for (int i = 0; i < queries.size(); i++) {
resQuery.add(-1);
}
for (int i = 0; i < queries.size(); i++) {
/* the query index starts from 1 or supposes the first index is 1 */
int index = (int) (queries.get(i) - 1);
int value = stockData.get(index).intValue();
int j = index + 1;
int k = index - 1;
while (j < stockData.size() - 1 || k > 1) {
if (k < 1) {
if (stockData.get(j).intValue() < value) {
resQuery.set(i, j + 1);
break;
}
}
else if (j > stockData.size() - 1) {
if (stockData.get(k).intValue() < value) {
resQuery.set(i, k + 1);
break;
}
}
else if (stockData.get(k).intValue() < value) {
resQuery.set(i, k + 1);
break;
}
else if (stockData.get(j).intValue() < value) {
resQuery.set(i, j + 1);
break;
}
j++;
k--;
}
}
}
당신이 날 공연을 향상시키기 위해이 코드를 리팩토링하는 데 도움이 수 있습니까?
당신의 알고리즘이 보인다 O(n^2)
시간 복잡도를. 이러한 문제를 해결하기 위해 두 가지 고전적인 방법이 있습니다 O(n)
. 스택 및 동적 프로그래밍을 사용하여 상기 제 중 하나를 사용하여 첫 번째.
나는 당신의 알고리즘에 좋지 않은 것을 설명하기 위해 예를 제시한다.
당신이 가정 [1, 4, 3, 2]
주가로.
세 번째 요소에 대해 3
, 그것은 반복됩니다 4
다음과 1
가장 가까운 작은 아래쪽을 찾을 수 있습니다.
마지막 요소에 대해 2
, 그것은 반복합니다 3
, 4
다음과 1
가장 가까운 작은 아래쪽을 찾을 수 있습니다. 이 계정에 당신이 전에했던 일을하지 않습니다 그래서 3
(당신이 반복 할 필요가 없다는 사실을 무시 4
그것보다 크기 때문에 3
보다 큰 정도 2
). 당신이 많은 연속이있는 경우 4
, 오히려 직접 점프보다 그들 모두를 반복합니다 1
.
동적 프로그래밍 알고리즘의 목적은 계정에 당신이 전에했던 일을하는 것입니다. 그것은 저장하는 배열을 사용하여 인덱스 각 주가에 대한 가장 가까운 작은 아래쪽의를. 위의 예와 함께,이 배열의 최종 버전이 될 것이다 [-1, 0, 0, 0]
( 1
우리는 -1로 표현되도록 타인 작은 가까운이고, 가장 가까운 작은 아래쪽없는 1
인덱스 0이다).
이 배열을 계산하려면 의해 초기화 [-1, -1, -1, -1]
. 마지막 요소를 처리 할 때 예를 들어, 당신은 할 것이다 [-1, 0, 0, -1]
. 당신은 그것을 비교 3
하고 찾아 3
당신이 작은의 가장 가까운으로 직접 이동할 수 있도록 큰 3
인덱스이다 0
. 그런 다음 인덱스의 요소에 요소를 비교 0
(입니다 1
). 1
당신이 가까운 작은을 찾을 수 있도록 작은 ...
그리고 당신은 가까운 작은 위쪽에 같은 일을 할 수 있습니다.