每日一題,防止癡呆 = =
一、題目大意
給定正整數數組 A,A[i] 表示第 i 個觀光景點的評分,並且兩個景點 i 和 j 之間的距離爲 j - i。
一對景點(i < j)組成的觀光組合的得分爲(A[i] + A[j] + i - j):景點的評分之和減去它們兩者之間的距離。
返回一對觀光景點能取得的最高分。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/best-sightseeing-pair
二、題目思路以及AC代碼
思路
這題首先想到如果進行暴力的話,複雜度是O(n^2),對於n=50000的數據來說是肯定會超時的。那麼我們可以對暴力的方法進行優化,即將計算分數的公式換一種寫法,score = A[i] + i + A[j] - j,這樣的話,我們在遍歷第j個景點的時候,只需要找到在 j 之前的景點中 A[i] + i 最大的就可以了,而 A[i] + i 最大,我們可以通過前綴數組或者一個變量來進行計算,從而在O(1)的時間複雜度內獲得,總體上就是對景點 j 進行遍歷,也就是O(n)的時間複雜度。
AC代碼
#define MAX_INT 2147483647
class Solution {
public:
int maxScoreSightseeingPair(vector<int>& A) {
int n_size = A.size();
int pre = A[0];
int max_val = -MAX_INT;
for (int i=1;i<n_size;i++) {
int res = A[i] - i + pre;
if (res > max_val) max_val = res;
if (A[i] + i > pre) pre = A[i] + i;
}
return max_val;
}
};
如果有問題,歡迎大家指正!!!