数组题目:最佳观光组合

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

相关文章

MySQL MCP 服务器安装配置最佳实践

《MySQLMCP服务器安装配置最佳实践》本文介绍MySQLMCP服务器的安装配置方法,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下... 目录mysql MCP 服务器安装配置指南简介功能特点安装方法数据库配置使用MCP Inspector进行调试开发指

SQLite3命令行工具最佳实践指南

《SQLite3命令行工具最佳实践指南》SQLite3是轻量级嵌入式数据库,无需服务器支持,具备ACID事务与跨平台特性,适用于小型项目和学习,sqlite3.exe作为命令行工具,支持SQL执行、数... 目录1. SQLite3简介和特点2. sqlite3.exe使用概述2.1 sqlite3.exe

mtu设置多少网速最快? 路由器MTU设置最佳网速的技巧

《mtu设置多少网速最快?路由器MTU设置最佳网速的技巧》mtu设置多少网速最快?想要通过设置路由器mtu获得最佳网速,该怎么设置呢?下面我们就来看看路由器MTU设置最佳网速的技巧... 答:1500 MTU值指的是在网络传输中数据包的最大值,合理的设置MTU 值可以让网络更快!mtu设置可以优化不同的网

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA

java中Optional的核心用法和最佳实践

《java中Optional的核心用法和最佳实践》Java8中Optional用于处理可能为null的值,减少空指针异常,:本文主要介绍java中Optional核心用法和最佳实践的相关资料,文中... 目录前言1. 创建 Optional 对象1.1 常规创建方式2. 访问 Optional 中的值2.1

Nginx Location映射规则总结归纳与最佳实践

《NginxLocation映射规则总结归纳与最佳实践》Nginx的location指令是配置请求路由的核心机制,其匹配规则直接影响请求的处理流程,下面给大家介绍NginxLocation映射规则... 目录一、Location匹配规则与优先级1. 匹配模式2. 优先级顺序3. 匹配示例二、Proxy_pa

python web 开发之Flask中间件与请求处理钩子的最佳实践

《pythonweb开发之Flask中间件与请求处理钩子的最佳实践》Flask作为轻量级Web框架,提供了灵活的请求处理机制,中间件和请求钩子允许开发者在请求处理的不同阶段插入自定义逻辑,实现诸如... 目录Flask中间件与请求处理钩子完全指南1. 引言2. 请求处理生命周期概述3. 请求钩子详解3.1

JAVA数组中五种常见排序方法整理汇总

《JAVA数组中五种常见排序方法整理汇总》本文给大家分享五种常用的Java数组排序方法整理,每种方法结合示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录前言:法一:Arrays.sort()法二:冒泡排序法三:选择排序法四:反转排序法五:直接插入排序前言:几种常用的Java数组排序

Vue 2 项目中配置 Tailwind CSS 和 Font Awesome 的最佳实践举例

《Vue2项目中配置TailwindCSS和FontAwesome的最佳实践举例》:本文主要介绍Vue2项目中配置TailwindCSS和FontAwesome的最... 目录vue 2 项目中配置 Tailwind css 和 Font Awesome 的最佳实践一、Tailwind CSS 配置1. 安

Spring Boot 常用注解详解与使用最佳实践建议

《SpringBoot常用注解详解与使用最佳实践建议》:本文主要介绍SpringBoot常用注解详解与使用最佳实践建议,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录一、核心启动注解1. @SpringBootApplication2. @EnableAutoConfi