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²)复杂度的问题优化到线性时间复杂度,是典型的空间换时间策略应用。该算法在房产平台景点推荐、旅行路线规划等场景都有实际应用价值。

相关推荐
MATLAB代码顾问27 分钟前
Python实现蜂群算法优化TSP问题
开发语言·python·算法
0xDevNull29 分钟前
Linux 中 Nginx 代理 Redis 的详细教程
redis·后端
代码飞天32 分钟前
机器学习算法和函数整理——助力快速查阅
人工智能·算法·机器学习
jiushiapwojdap40 分钟前
LU分解法求解线性方程组Matlab实现
数据结构·其他·算法·matlab
GetcharZp1 小时前
告别 Nginx 手动配置!这款 Go 语言开发的云原生网关,才是容器化时代的真香神器!
后端
RuoyiOffice1 小时前
SpringBoot+Vue3 企业考勤如何处理法定假期?节假日方案、调休补班与工作日判断链路拆解
spring boot·后端·vue·anti-design-vue·ruoyioffice·假期·人力
笨笨饿1 小时前
69_如何给自己手搓一个串口
linux·c语言·网络·单片机·嵌入式硬件·算法·个人开发
Vane11 小时前
从零开发一个AI插件,经历了什么?
人工智能·后端
纽扣6672 小时前
【算法进阶之路】链表进阶:删除、合并、回文与排序全解析
数据结构·算法·链表
Cosolar2 小时前
一文吃透 LangChain&LangGraph:设计理念、框架结构与内部组件全拆解
人工智能·面试·架构