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 @   牛有肉  阅读(57)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示