Original Problem#
https://leetcode.cn/problems/best-sightseeing-pair/description/
Idea#
Double loop enumeration
class Solution {
public:
int maxScoreSightseeingPair(vector<int>& values) {
int max = 0;
int length = values.size();
for(int i = 0; i < length; ++i)
for(int j = i + 1; j < length; ++j)
if(values[i] + values[j] + i - j > max)
max = values[i] + values[j] + i - j;
return max;
}
};
But it cannot pass all test cases. The time complexity is too high .
Solution#
Idea: Reduce complexity. Find a way to achieve a complexity of .
Rearranging the objective function gives (value[i] + i) + (value[j] - j)
, then treat value[i] + i
as a whole and value[j] - j
as another whole. This transforms it into finding the maximum of two numbers.
Consider iterating over j
while maintaining the maximum value of value[i] + i
, so the code can be changed to
class Solution {
public:
int maxScoreSightseeingPair(vector<int>& values) {
int ans = 0;
int mx = 0;
for(int j = 0; j < values.size(); ++j){
ans = max(ans, mx + values[j] - j);
mx = max(mx, values[j] + j);
}
return ans;
}
};
Enumerate Right to Maintain Left#
For problems similar to the double variable problem shown in leetcode 1014, you can choose to enumerate the right index to transform it into a single variable problem for solving.
For similar problems, refer to https://leetcode.cn/circle/discuss/mOr1u6/