原題#
https://leetcode.cn/problems/best-sightseeing-pair/description/
思路#
雙循環枚舉
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;
}
};
但不能通過全部測試點。時間複雜度過高
題解#
思路:降低複雜度。想辦法弄成 的複雜度就好了。
目標函數移項得到 (value[i] + i) + (value[j] - j)
,然後將 value[i] + i
當做整體,將 value[j] - j
當做整體。就轉化為了兩數的最大值。
考慮遍歷 j
然後維護 value[i] + i
的最大值,所以代碼可以變為
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;
}
};
枚舉右維護左#
對於類似 leetcode 1014 所示的雙變量問題,可以選擇枚舉右下標 ,來轉化為單變量問題求解。