数组题目:最佳观光组合

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

相关文章

Java 的ArrayList集合底层实现与最佳实践

《Java的ArrayList集合底层实现与最佳实践》本文主要介绍了Java的ArrayList集合类的核心概念、底层实现、关键成员变量、初始化机制、容量演变、扩容机制、性能分析、核心方法源码解析、... 目录1. 核心概念与底层实现1.1 ArrayList 的本质1.1.1 底层数据结构JDK 1.7

JavaScript对象转数组的三种方法实现

《JavaScript对象转数组的三种方法实现》本文介绍了在JavaScript中将对象转换为数组的三种实用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录方法1:使用Object.keys()和Array.map()方法2:使用Object.entr

Java 中 Optional 的用法及最佳实践

《Java中Optional的用法及最佳实践》在Java开发中,空指针异常(NullPointerException)是开发者最常遇到的问题之一,本篇文章将详细讲解Optional的用法、常用方... 目录前言1. 什么是 Optional?主要特性:2. Optional 的基本用法2.1 创建 Opti

Java 字符串操作之contains 和 substring 方法最佳实践与常见问题

《Java字符串操作之contains和substring方法最佳实践与常见问题》本文给大家详细介绍Java字符串操作之contains和substring方法最佳实践与常见问题,本文结合实例... 目录一、contains 方法详解1. 方法定义与语法2. 底层实现原理3. 使用示例4. 注意事项二、su

Java 单元测试之Mockito 模拟静态方法与私有方法最佳实践

《Java单元测试之Mockito模拟静态方法与私有方法最佳实践》本文将深入探讨如何使用Mockito来模拟静态方法和私有方法,结合大量实战代码示例,带你突破传统单元测试的边界,写出更彻底、更独立... 目录Mockito 简介:为什么选择它?环境准备模拟静态方法:打破“不可变”的枷锁传统困境解法一:使用M

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. 按