어떻게 자바에서이 방법을 최적화? 나는 시간 제한이 초과 무엇입니까

theUturn :

나는 하나의 요소의 인덱스가,이 목록을 가지고 있고 다른 하나는 주가가 있습니다. 각 인덱스의 나는 현재 지수와 가장 가까운에 주가보다 작은 중 주식 배열에 위 또는 아래로 최소 가까운 주가를 찾을 수있다. 여기 내 코드입니다. 그것은 정확하지만, 너무 너무 느린입니다 제공 시간 제한 실행 오류 ;

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--;
        }
    }
}

당신이 날 공연을 향상시키기 위해이 코드를 리팩토링하는 데 도움이 수 있습니까?

Sarmon :

당신의 알고리즘이 보인다 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당신이 가까운 작은을 찾을 수 있도록 작은 ...

그리고 당신은 가까운 작은 위쪽에 같은 일을 할 수 있습니다.

추천

출처http://43.154.161.224:23101/article/api/json?id=25461&siteId=1