前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一天一大 leet(最佳观光组合)难度:中等 DAY-17

一天一大 leet(最佳观光组合)难度:中等 DAY-17

作者头像
前端小书童
发布2020-09-24 11:22:04
2910
发布2020-09-24 11:22:04
举报
文章被收录于专栏:前端小书童
题目(难度:困难):

给定正整数数组 A,A[i] 表示第 i 个观光景点的评分,并且两个景点 i 和 j 之间的距离为 j - i。

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

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

示例

代码语言:javascript
复制
输入:[8,1,5,2,6]
输出:11
解释:i = 0, j = 2, A[i] + A[j] + i - j = 8 + 5 + 0 - 2 = 11

提示

  1. 2 <= A.length <= 50000
  2. <= A[i] <= 1000

抛砖引玉

A[i] + A[j] + i - j (i < j)

拆分公式

  • (A[i] + i) + (A[j] - j)
  • 循环前面一个数组加自身索引,后面一个数字减自身索引
  • A[i] + i 取数组中最大值,这样分别与 A[j] - j 相加才能取到最大值
    • 如果当前的 A[i] + i 小于上一个和则指针不切换,依次向后查询 A[j] - j
    • 如果当前的 A[i] + i 大于上一个和则指针切换成较大值
代码语言:javascript
复制
/**
 * @param {number[]} A
 * @return {number}
 */
var maxScoreSightseeingPair = function (A) {
  let _result = 0,
    middleValue = A[0] + 0
  for (let i = 1; i < A.length; i++) {
    _result = Math.max(A[i] + middleValue - i, _result)
    middleValue = Math.max(middleValue, A[i] + i)
  }
  return _result
}
代码语言:javascript
复制

官方答案

代码语言:javascript
复制
/**
 * @param {number[]} A
 * @return {number}
 */
var maxScoreSightseeingPair = function (A) {
  var ans = 0, mx = A[0] + 0;
  for (int j = 1; j < A.length; ++j) {
      ans = max(ans, mx + A[j] - j);
      // 边遍历边维护
      mx = max(mx, A[j] + j);
  }
  return ans;
}
代码语言:javascript
复制

其他解法

代码语言:javascript
复制
/**
 * @param {number[]} A
 * @return {number}
 */
var maxScoreSightseeingPair = function (A) {
  let res = 0,
    prev = 0
  for (let i = 1; i < A.length; i++) {
    //prev是前i-1个元素中A[m]+m的最大值
    prev = Math.max(prev, A[i - 1] + i - 1) 
    res = Math.max(res, prev + A[i] - i)
  }
  return res
}

菜鸟的自白

  • 几种思路基本是一致的
  • 需要注意的地方:

所有指针只能从 i 开始,另外如果忽略了这个限制条件使用 A[j]+j 那结果都会普遍变大

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端小书童 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 示例
  • 提示
  • 抛砖引玉
  • 拆分公式
  • 官方答案
  • 其他解法
  • 菜鸟的自白
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档