3

输入数组是:

A[0] = 23171 
A[1] = 21015 
A[2] = 21123
A[3] = 21366 
A[4] = 21013 
A[5] = 21367

使命是找到最大的利润。例如 A[3] - A[2] = 243 我的代码是:

class Solution {
    int profit = 0;
    public int solution(int[] A) {
         for (int i = 0;i < A.length; i++){
            for (int j = i + 1; j < A.length; j++){
                if(A[j] - A[i] > profit)
                    profit = A[j] - A[i];
            }
         }
         return profit;
   }
}

结果假设为 365,但它在更大的输入时会爆炸。该代码的时间复杂度为 O(N 2 ),但可以使用 O(N)。我真的看不出如何避免在这里嵌套......任何正确方向的指针都值得赞赏。

4

2 回答 2

14

您只需要从数组中获取最大值和最小值并将它们都减去,因此在 O(N) 迭代中,获取最小值和最大值。

class Solution {

    public int solution(int[] A) {

        int min = Integer.MAX_VALUE;
        int max = Integer.MIN_VALUE;

        for (int i = 0;i < A.length; i++){
            if(A[i] > max) max = A[i];
            if(A[i] < min) min = A[i];
        }

        return max - min;
    }
}
于 2013-11-13T16:27:41.467 回答
10

我想你们中的大多数人都搞错了。帖子中的问题是最大单笔销售利润问题,这是一个典型的面试问题。

最优解

    public int dynamicProgrammingSingleSellProfit(int[] arr) {
        if(arr.length == 0) {
            return 0;
        }
        int profit = 0;
        int cheapest = arr[0];

        for (int i = 0; i < arr.length; i++) {

            cheapest = Math.min(cheapest, arr[i]);
            profit = Math.max(profit, arr[i] - cheapest);

        }
        return profit;
    }

它具有O(n)时间和O(1)空间复杂性。

如果您检查操作员正在寻找的原始问题,profit并且由于我们无法及时旅行(还),您不能只比较数组中的最小值和最大值。

于 2013-11-13T16:57:35.457 回答