Leetcode 1014 最佳观光组合

 

  暴力法:

    public final int maxScoreSightseeingPair(int[] values) {
        int len = values.length, re = 0;
        for (int i = 0; i < len; i++) {
            //剪枝用
            int maxJ = 0;
            for (int j = i + 1; j < len; j++) {
                if (values[j] > maxJ) {
                    maxJ = values[j];
                    re = Math.max(re, values[i] + values[j] + i - j);
                }
            }
        }
        return re;
    }

  时间复杂度为 O(n2) 。剪枝已无可剪,继续优化需要转换遍历思路。

  对于 i,j 的得分,为 values[i]+values[j]+i-j,分解可得 (values[i]+i)+(values[j]-j)对于固定一点 j,取 values[i]+i 的最大值即可得到最高得分。

  那么对于固定的一点 j ,只需要获取坐标在起之前的最大的 values[i]+i 即可。

  顺序遍历不断的取 values[i]+i 的最大值,便可在 O(N)的时间复杂度内得到结果。

  可以这么做的前提是,i 与 j 具有先后顺序,已经体现在了 (values[i]+i)+(values[j]-j) 公式中。

    public final int maxScoreSightseeingPair2(int[] values) {
        int len = values.length, ans = 0, max = values[0];
        for (int i = 1; i < len; i++) {
            ans = Math.max(ans, max + values[i] - i);
            max = Math.max(max, values[i] + i);
        }
        return ans;
    }

  JS:

var maxScoreSightseeingPair = function (values) {
    let re = 0, maxBegin = values[0];
    for (let i = 1; i < values.length; i++) {
        re = Math.max(re, maxBegin + values[i] - i);
        maxBegin = Math.max(maxBegin, values[i] + i);
    }
    return re;
};

 

posted @ 2021-04-18 22:11  牛有肉  阅读(56)  评论(0编辑  收藏  举报