数组题目:最佳观光组合

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

相关文章

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que

hdu4869(逆元+求组合数)

//输入n,m,n表示翻牌的次数,m表示牌的数目,求经过n次操作后共有几种状态#include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdlib.h>#includ

hdu 1166 敌兵布阵(树状数组 or 线段树)

题意是求一个线段的和,在线段上可以进行加减的修改。 树状数组的模板题。 代码: #include <stdio.h>#include <string.h>const int maxn = 50000 + 1;int c[maxn];int n;int lowbit(int x){return x & -x;}void add(int x, int num){while

题目1254:N皇后问题

题目1254:N皇后问题 时间限制:1 秒 内存限制:128 兆 特殊判题:否 题目描述: N皇后问题,即在N*N的方格棋盘内放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在同一斜线上。因为皇后可以直走,横走和斜走如下图)。 你的任务是,对于给定的N,求出有多少种合法的放置方法。输出N皇后问题所有不同的摆放情况个数。 输入

题目1380:lucky number

题目1380:lucky number 时间限制:3 秒 内存限制:3 兆 特殊判题:否 提交:2839 解决:300 题目描述: 每个人有自己的lucky number,小A也一样。不过他的lucky number定义不一样。他认为一个序列中某些数出现的次数为n的话,都是他的lucky number。但是,现在这个序列很大,他无法快速找到所有lucky number。既然

如何确定 Go 语言中 HTTP 连接池的最佳参数?

确定 Go 语言中 HTTP 连接池的最佳参数可以通过以下几种方式: 一、分析应用场景和需求 并发请求量: 确定应用程序在特定时间段内可能同时发起的 HTTP 请求数量。如果并发请求量很高,需要设置较大的连接池参数以满足需求。例如,对于一个高并发的 Web 服务,可能同时有数百个请求在处理,此时需要较大的连接池大小。可以通过压力测试工具模拟高并发场景,观察系统在不同并发请求下的性能表现,从而

C语言:柔性数组

数组定义 柔性数组 err int arr[0] = {0}; // ERROR 柔性数组 // 常见struct Test{int len;char arr[1024];} // 柔性数组struct Test{int len;char arr[0];}struct Test *t;t = malloc(sizeof(Test) + 11);strcpy(t->arr,

C 语言基础之数组

文章目录 什么是数组数组变量的声明多维数组 什么是数组 数组,顾名思义,就是一组数。 假如班上有 30 个同学,让你编程统计每个人的分数,求最高分、最低分、平均分等。如果不知道数组,你只能这样写代码: int ZhangSan_score = 95;int LiSi_score = 90;......int LiuDong_score = 100;int Zhou

Prometheus与Grafana在DevOps中的应用与最佳实践

Prometheus 与 Grafana 在 DevOps 中的应用与最佳实践 随着 DevOps 文化和实践的普及,监控和可视化工具已成为 DevOps 工具链中不可或缺的部分。Prometheus 和 Grafana 是其中最受欢迎的开源监控解决方案之一,它们的结合能够为系统和应用程序提供全面的监控、告警和可视化展示。本篇文章将详细探讨 Prometheus 和 Grafana 在 DevO

springboot整合swagger2之最佳实践

来源:https://blog.lqdev.cn/2018/07/21/springboot/chapter-ten/ Swagger是一款RESTful接口的文档在线自动生成、功能测试功能框架。 一个规范和完整的框架,用于生成、描述、调用和可视化RESTful风格的Web服务,加上swagger-ui,可以有很好的呈现。 SpringBoot集成 pom <!--swagge