zoukankan      html  css  js  c++  java
  • 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;
    };

    当你看清人们的真相,于是你知道了,你可以忍受孤独
  • 相关阅读:
    python数字
    python字符串方法
    python操作符与流程控制
    网络基础和python(二)
    网络基础和python
    Ubuntu源更新
    make和makefile介绍
    JavaScript
    redis mac安装配置
    网络编程之socket(TCP,UDP)
  • 原文地址:https://www.cnblogs.com/niuyourou/p/14674853.html
Copyright © 2011-2022 走看看