数组题目:最佳观光组合

2024-02-06 07:18

本文主要是介绍数组题目:最佳观光组合,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 题目
    • 标题和出处
    • 难度
    • 题目描述
      • 要求
      • 示例
      • 数据范围
  • 解法
    • 思路和算法
    • 代码
    • 复杂度分析

题目

标题和出处

标题:最佳观光组合

出处:1014. 最佳观光组合

难度

4 级

题目描述

要求

给定正整数数组 values \texttt{values} values values[i] \texttt{values[i]} values[i] 表示第 i \texttt{i} i 个观光景点的评分,并且两个景点 i \texttt{i} i j \texttt{j} j 之间的距离为 j - i \texttt{j - i} j - i

一对景点( i < j \texttt{i < j} i < j)组成的观光组合的得分为 values[i] + values[j] + i - j \texttt{values[i] + values[j] + i - j} values[i] + values[j] + i - j:景点的评分之和减去它们两者之间的距离。

返回一对观光景点能取得的最高分。

示例

示例 1:

输入: values = [8,1,5,2,6] \texttt{values = [8,1,5,2,6]} values = [8,1,5,2,6]
输出: 11 \texttt{11} 11
解释: i = 0, j = 2, values[i] + values[j] + i - j = 8 + 5 + 0 - 2 = 11 \texttt{i = 0, j = 2, values[i] + values[j] + i - j = 8 + 5 + 0 - 2 = 11} i = 0, j = 2, values[i] + values[j] + i - j = 8 + 5 + 0 - 2 = 11

示例 2:

输入: values = [1,2] \texttt{values = [1,2]} values = [1,2]
输出: 2 \texttt{2} 2

数据范围

  • 2 ≤ values.length ≤ 5 × 10 4 \texttt{2} \le \texttt{values.length} \le \texttt{5} \times \texttt{10}^\texttt{4} 2values.length5×104
  • 1 ≤ values[i] ≤ 1000 \texttt{1} \le \texttt{values[i]} \le \texttt{1000} 1values[i]1000

解法

思路和算法

假设数组 values \textit{values} values 的长度是 n n n。最直观的做法是遍历每一对下标 ( i , j ) (i,j) (i,j),其中 0 ≤ i < j < n 0 \le i<j<n 0i<j<n,计算观光组合得分,时间复杂度是 O ( n 2 ) O(n^2) O(n2),会超出时间限制,因此必须优化。

i < j i<j i<j 时,将景点对 ( i , j ) (i,j) (i,j) 组成的观光组合的得分记为 f ( i , j ) f(i,j) f(i,j),则有:

f ( i , j ) = values [ i ] + values [ j ] + i − j f(i,j)=\textit{values}[i] + \textit{values}[j] + i - j f(i,j)=values[i]+values[j]+ij

是否可以优化 f ( i , j ) f(i,j) f(i,j) 的计算呢?注意到 f ( i , j ) f(i,j) f(i,j) 可以写成如下形式:

f ( i , j ) = values [ i ] + i + values [ j ] − j ( i < j ) f(i,j)=\textit{values}[i] + i + \textit{values}[j] - j (i<j) f(i,j)=values[i]+i+values[j]j(i<j)

g ( i ) = values [ i ] + i g(i)=\textit{values}[i] + i g(i)=values[i]+i h ( j ) = values [ j ] − j h(j)=\textit{values}[j] - j h(j)=values[j]j,则有:

f ( i , j ) = g ( i ) + h ( j ) ( i < j ) f(i,j)=g(i)+h(j) (i<j) f(i,j)=g(i)+h(j)(i<j)

由此可以想到优化的做法:遍历数组 values \textit{values} values,遍历过程中维护最大的 g g g 的值,根据最大的 g g g 的值和当前的 h ( j ) h(j) h(j) 的值计算观光组合的最高得分。

具体实现方面,维护 leftMax \textit{leftMax} leftMax 为最大的 g g g 的值,初始时 leftMax = values [ 0 ] + 0 = values [ 0 ] \textit{leftMax}=\textit{values}[0]+0=\textit{values}[0] leftMax=values[0]+0=values[0]。从左到右遍历数组 values \textit{values} values,对于 1 ≤ i < n 1 \le i<n 1i<n,计算 h ( i ) h(i) h(i) 的值,使用 leftMax + h ( i ) \textit{leftMax}+h(i) leftMax+h(i) 更新观光组合的最高得分,然后用 g ( i ) g(i) g(i) 更新 leftMax \textit{leftMax} leftMax 的值。

上述两步操作的顺序不能颠倒,必须先更新观光组合的最高得分,后更新 leftMax \textit{leftMax} leftMax 的值,因为观光组合必须是两个不同的景点的组合。

代码

class Solution {public int maxScoreSightseeingPair(int[] values) {int maxScore = 0;int leftMax = values[0];int length = values.length;for (int i = 1; i < length; i++) {int right = values[i] - i;maxScore = Math.max(maxScore, leftMax + right);leftMax = Math.max(leftMax, values[i] + i);}return maxScore;}
}

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是数组 values \textit{values} values 的长度。需要遍历数组 values \textit{values} values 一次,对每个下标位置计算最大评分之和的时间复杂度是 O ( 1 ) O(1) O(1),因此总时间复杂度是 O ( n ) O(n) O(n)

  • 空间复杂度: O ( 1 ) O(1) O(1)

这篇关于数组题目:最佳观光组合的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/683541

相关文章

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按

Java中数组与栈和堆之间的关系说明

《Java中数组与栈和堆之间的关系说明》文章讲解了Java数组的初始化方式、内存存储机制、引用传递特性及遍历、排序、拷贝技巧,强调引用数据类型方法调用时形参可能修改实参,但需注意引用指向单一对象的特性... 目录Java中数组与栈和堆的关系遍历数组接下来是一些编程小技巧总结Java中数组与栈和堆的关系关于

Java Stream 的 Collectors.toMap高级应用与最佳实践

《JavaStream的Collectors.toMap高级应用与最佳实践》文章讲解JavaStreamAPI中Collectors.toMap的使用,涵盖基础语法、键冲突处理、自定义Map... 目录一、基础用法回顾二、处理键冲突三、自定义 Map 实现类型四、处理 null 值五、复杂值类型转换六、处理

MyBatis-Plus 自动赋值实体字段最佳实践指南

《MyBatis-Plus自动赋值实体字段最佳实践指南》MyBatis-Plus通过@TableField注解与填充策略,实现时间戳、用户信息、逻辑删除等字段的自动填充,减少手动赋值,提升开发效率与... 目录1. MyBATis-Plus 自动赋值概述1.1 适用场景1.2 自动填充的原理1.3 填充策略

Olingo分析和实践之EDM 辅助序列化器详解(最佳实践)

《Olingo分析和实践之EDM辅助序列化器详解(最佳实践)》EDM辅助序列化器是ApacheOlingoOData框架中无需完整EDM模型的智能序列化工具,通过运行时类型推断实现灵活数据转换,适用... 目录概念与定义什么是 EDM 辅助序列化器?核心概念设计目标核心特点1. EDM 信息可选2. 智能类

Zabbix在MySQL性能监控方面的运用及最佳实践记录

《Zabbix在MySQL性能监控方面的运用及最佳实践记录》Zabbix通过自定义脚本和内置模板监控MySQL核心指标(连接、查询、资源、复制),支持自动发现多实例及告警通知,结合可视化仪表盘,可有效... 目录一、核心监控指标及配置1. 关键监控指标示例2. 配置方法二、自动发现与多实例管理1. 实践步骤