怎样在手机上网站建设,买个域名,网站建设需求分析有什么内容,学校校园网站建设必要性1 题目
1014. 最佳观光组合
给你一个正整数数组 values#xff0c;其中 values[i] 表示第 i 个观光景点的评分#xff0c;并且两个景点 i 和 j 之间的 距离 为 j - i。
一对景点#xff08;i j#xff09;组成的观光组合的得分为 values[i] values[j] i - j 其中values[i]表示第i个观光景点的评分并且两个景点i和j之间的距离为j - i。一对景点i j组成的观光组合的得分为values[i] values[j] i - j也就是景点的评分之和减去它们两者之间的距离。返回一对观光景点能取得的最高分。示例 1输入values [8,1,5,2,6]输出11解释i 0, j 2, values[i] values[j] i - j 8 5 0 - 2 11示例 2输入values [1,2]输出22 代码实现class Solution { public: int maxScoreSightseeingPair(vectorint values) { int best values[0]; int ans 0; for (int j 1 ; j values.size() ; j){ ans max (ans, best values[j] - j ); best max(best , values[j] j ); } return ans; } };题解思路一句话版把公式values[i] values[j] i - j拆成(values[i] i) (values[j] - j)遍历j的时候只需要维护j 左边最大的values[i] i。C 代码推荐写法#include vector #include algorithm using namespace std; class Solution { public: int maxScoreSightseeingPair(vectorint values) { int best values[0]; // 当前最大的 values[i] i int ans 0; for (int j 1; j values.size(); j) { // 用当前 best 和 j 计算得分 ans max(ans, best values[j] - j); // 更新 best供后面的 j 使用 best max(best, values[j] j); } return ans; } };为什么是 O(n)每个元素只遍历一次只用了两个变量时间复杂度O(n)空间复杂度O(1)再帮你对比一下暴力解法为什么不行暴力写法会超时for (int i 0; i n; i) { for (int j i 1; j n; j) { ans max(ans, values[i] values[j] i - j); } }时间复杂度O(n²)n 最大到 5 万直接炸 记忆口诀刷题用i 在左j 在右i 的最大值提前存j 来了直接算详解这段代码中循环里计算得分和更新best的逻辑首先我们先明确这道题的核心公式对于观光配对(i, j)要求i j得分是values[i] values[j] i - j。我们可以把这个公式拆分成两部分第一部分values[i] i只和i有关第二部分values[j] - j只和j有关所以得分就等价于(values[i] i) (values[j] - j)i j。代码逻辑逐行解释class Solution { public: int maxScoreSightseeingPair(vectorint values) { int best values[0]; // 初始化为 values[0] 0因为i0时values[i]i就是values[0]0 int ans 0; for (int j 1; j values.size(); j) { // 第一步用当前找到的最优i对应bestvalues[i]i和当前j计算得分 // 得分 (values[i]i) (values[j]-j) best values[j] - j ans max(ans, best values[j] - j); // 第二步更新best把当前j当作新的i候选因为后面的j j此时j就是i // 新的候选值是 values[j] j和原来的best比保留更大的那个 best max(best, values[j] j); } return ans; } };举个例子帮你理解假设values [8,1,5,2,6]我们一步步走一遍初始化best 8 0 8ans 0j1values[j]1得分8 1 - 1 8→ans 8更新 bestmax(8, 112)→best8j2values[j]5得分8 5 - 2 11→ans 11更新 bestmax(8, 527)→best8j3values[j]2得分8 2 - 3 7→ans还是 11更新 bestmax(8, 235)→best8j4values[j]6得分8 6 - 4 10→ans还是 11更新 bestmax(8, 6410)→best10最终返回ans11对应 i0j2 的配对得分 850-211和计算结果一致总结公式拆分是核心将原得分公式values[i]values[j]i-j拆分为(values[i]i) (values[j]-j)把双变量问题转化为单变量的遍历问题。贪心维护最优值遍历j时用best维护之前所有i j中values[i]i的最大值这样每一步只需要 O (1) 计算整体时间复杂度是 O (n)。遍历顺序因为要求i j所以从j1开始遍历先计算当前j的得分再更新best避免 j 自己和自己配对。