MarsCode算法题解:观光景点最高得分(Java实现)

题目描述

小R在评估一组观光景点,每个景点的评分存储在数组values中。一对景点(i, j)(i < j)的得分为values[i] + values[j] + i - j。我们需要找出能获得最高得分的组合。

输入约束

  • 2 <= values.length <= 10^5
  • 1 <= values[i] <= 1000

一、解题思路分析

关键公式转换

将得分公式变形为:score = (values[i] + i) + (values[j] - j)

算法策略

  • 单次遍历法:维护两个关键变量

    1. max_left:记录遍历过程中遇到的最大values[i] + i
    2. max_score:记录全局最高得分
  • 时间复杂度:O(n)

  • 空间复杂度:O(1)


二、完整Java实现

java 复制代码
public class SightseeingScore {

    public static int maxScore(int[] values) {
        if (values == null || values.length < 2) {
            throw new IllegalArgumentException("Invalid input");
        }
        
        int maxLeft = values[0] + 0;  // 初始化第一个元素的values[i]+i
        int maxScore = Integer.MIN_VALUE;
        
        for (int j = 1; j < values.length; j++) {
            // 计算当前组合得分
            int currentScore = maxLeft + (values[j] - j);
            maxScore = Math.max(maxScore, currentScore);
            
            // 更新maxLeft为当前最大的values[i]+i
            maxLeft = Math.max(maxLeft, values[j] + j);
        }
        
        return maxScore;
    }

    public static void main(String[] args) {
        // 测试案例
        int[] test1 = {8, 3, 5, 5, 6};
        System.out.println(maxScore(test1));  // 输出: 11
        
        int[] test2 = {10, 4, 8, 7};
        System.out.println(maxScore(test2));  // 输出: 16
        
        int[] test3 = {1, 2, 3, 4, 5};
        System.out.println(maxScore(test3));  // 输出: 8
    }
}

三、代码解析

核心逻辑分解

  1. 初始化阶段

    • maxLeft初始化为第一个元素的values[0] + 0
    • maxScore初始化为最小整数值
  2. 遍历过程

    • 对每个j(从索引1开始):

      • 计算当前组合得分:currentScore = maxLeft + (values[j] - j)
      • 更新全局最高得分
      • 更新maxLeft为当前最大的values[j] + j

边界处理

  • 输入校验确保数组长度合法
  • 自动处理i < j的约束条件

四、算法正确性验证

测试案例演示

案例1

输入:[8,3,5,5,6]

计算过程:

java 复制代码
i=0,j=1 → 8+0 +3-1=10  
i=0,j=2 → 8+0 +5-2=11(最高分)  
后续组合得分均不超过11

输出:11

案例2

输入:[10,4,8,7]

最佳组合:

java 复制代码
i=0,j=2 →10+0 +8-2=16

输出:16


五、性能优化说明

对比暴力解法

方法 时间复杂度 空间复杂度 是否通过大数据测试
暴力二重循环 O(n²) O(1)
单次遍历法 O(n) O(1)

适用场景

  • 特别适合处理长数组(10^5级别)
  • 内存敏感型应用场景

总结:通过公式变形将问题转化为动态维护最大值问题,使得原本O(n²)复杂度的问题优化到线性时间复杂度,是典型的空间换时间策略应用。该算法在房产平台景点推荐、旅行路线规划等场景都有实际应用价值。

相关推荐
Elendill18 分钟前
【算法笔记】并查集详解
笔记·python·算法
isfox31 分钟前
速学!Java 原子操作,开启并发编程新境界
后端·程序员
楽码37 分钟前
只需一文!深入理解闭包的实现
后端·go·编程语言
BanyeBirth42 分钟前
C++高精度算法(加、减、乘)
开发语言·c++·算法
houliabc42 分钟前
C语言个人笔记
c语言·数据结构·笔记·算法
cong_1 小时前
🌟摸鱼 TV 搭建属于自己的视频站
前端·后端·github
bobz9651 小时前
内网网络 rp_filter 参数配置
后端
QING6181 小时前
Activity和Fragment生命周期 —— 新手指南
android·面试·app
开心就好20251 小时前
【机器学习】用户手机使用行为分析
后端
zwrlj5271 小时前
编码能效插件SmartInputPro插件扩展
后端