[數學] leetcode 1131 Maximum of Absolute Value Expression


problem:https://leetcode.com/problems/maximum-of-absolute-value-expression/

        這道題讓我想到了leetcode上另一個題目:https://leetcode.com/problems/best-sightseeing-pair/, 兩題都是和下標以及下標對應的數字同時有關的。

        sightseeing這道題一開始並沒有想到答案,最后是去評論區白嫖了一個,思路非常巧妙,原題要求的是:

        求數組A中,A[ i ] + A[ j ] + i - j (i < j ) 的最大值。

        可以將其轉換為求 (A[ i ] + i ) + (A[ j ] - j) (i < j)的最大值。

        也就是說,我們將其視為兩個部分來求解。在遍歷數組A的時候,我們每一輪都更新當前A[ j ] - j 的值,並同時維護A[ i ] + i 的最大值。每一輪我們都計算當前輪中 A[ j ] - j 的值加上最大值的A[ i ] + i,在所有的N(數組長度)個結果中取得最大值。

        多虧了之前做過這一題,才想到周賽這題的思路,也就是拆成兩部分計算。

        比較麻煩的是這里有絕對值,根據高中數學,有絕對值就意味着要分類討論,去除絕對值后就有多種可能的符號結果了。

        將絕對值去掉后,要做的事情就是合並同類項,也就是把和 i 有關的放在一起,和 j 有關的放到另一邊。

        最終得到 S( i ) - S( j ) 形式的公式,其中S( i ) 根據絕對值去掉后有4種可能的結果。那么問題就轉換為求S( i ) - S( j )的最大值了,也就是S( i ) (最大)和 S( j ) (最小)。

class Solution {
public:
    int maxAbsValExpr(vector<int>& arr1, vector<int>& arr2) {
        int n = arr1.size();
        vector<vector<int>> v(4, vector<int>(n));
        vector<int> minnum(4, INT_MAX);
        vector<int> maxnum(4, INT_MIN);
        for(int i = 0;i < n;i++)
        {
            v[0][i] = arr1[i] + arr2[i] + i;
            v[1][i] = arr1[i] - arr2[i] + i;
            v[2][i] = -arr1[i] + arr2[i] + i;
            v[3][i] = -arr1[i] - arr2[i] + i;
            
            for(int j = 0;j < 4;j++)
            {
                minnum[j] = min(minnum[j], v[j][i]);
                maxnum[j] = max(maxnum[j], v[j][i]);
            }
        }
        int res = INT_MIN;
        for(int i = 0;i < 4;i++)
        {
            res = max(maxnum[i] - minnum[i], res);
        }
        return res;
    }
};

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM