【每日一題】LeetCode. 1014. 最佳觀光組合

每日一題,防止癡呆 = =

一、題目大意

給定正整數數組 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;
    }
};

如果有問題,歡迎大家指正!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章