leetcode 最長(zhǎng)定差子序列 -- Map

給你一個(gè)整數(shù)數(shù)組 arr 和一個(gè)整數(shù) difference,請(qǐng)你找出 arr 中所有相鄰元素之間的差等于給定 difference 的等差子序列,并返回其中最長(zhǎng)的等差子序列的長(zhǎng)度。

示例1

輸入:arr = [1,2,3,4], difference = 1
輸出:4
解釋:最長(zhǎng)的等差子序列是 [1,2,3,4]。

示例2

輸入:arr = [1,3,5,7], difference = 1
輸出:1
解釋:最長(zhǎng)的等差子序列是任意單個(gè)元素。

示例3

輸入:arr = [1,5,7,8,5,3,4,2,1], difference = -2
輸出:4
解釋:最長(zhǎng)的等差子序列是 [7,5,3,1]。

提示:

  • 1 <= arr.length <= 10^5
  • -10^4 <= arr[i], difference <= 10^4

該題需要注意的地方為:

  • 要按照數(shù)組本來(lái)的順序,不能對(duì)數(shù)組進(jìn)行排序操作

在解題時(shí),我自己的想法是外面一個(gè)循環(huán),里面再?gòu)漠?dāng)前元素出發(fā),尋找當(dāng)前元素的等差數(shù)列,雖然有對(duì)使用過(guò)的元素進(jìn)行標(biāo)記,不再循環(huán),但是依然是將近O(n*n)的復(fù)雜度。我朋友的想法就是使用Map數(shù)組來(lái)存儲(chǔ)每個(gè)元素的等差數(shù)列長(zhǎng)度,只需要一層循環(huán),在循環(huán)時(shí),查找Map數(shù)組中是否有當(dāng)前元素的前一項(xiàng),如果有,取出前一項(xiàng)的等差數(shù)列的長(zhǎng)度,將這個(gè)長(zhǎng)度加1就是當(dāng)前元素的等差數(shù)列的長(zhǎng)度。最后只需要找出Map數(shù)組中等差數(shù)列長(zhǎng)度的最大值了。由于Map數(shù)組查找的算法復(fù)雜度為O(logn),因此總體的算法復(fù)雜度為O(nlogn)。

class Solution {
public:
    int longestSubsequence(vector<int>& arr, int difference) {
        map<int,int> storeMap;
        for(int i=0;i<arr.size();i++){
            int preValue = arr[i] - difference;
            auto iter = storeMap.find(preValue);
            if(iter != storeMap.end()){
                auto iter2 = storeMap.find(arr[i]);
                if(iter2 != storeMap.end()){
                    iter2->second = iter->second+1;
                }
                else{
                    storeMap.insert(pair<int,int>(arr[i], iter->second + 1));
                }
            }
            else{
                storeMap.insert(pair<int,int>(arr[i], 1));
            }
        }
        int max_len = 1;
        for(auto iter=storeMap.begin();iter!=storeMap.end();iter++){
            if(iter->second > max_len){
                max_len = iter->second;
            }
        }
        return max_len; 
    }
};

題目鏈接:https://leetcode.com/contest/weekly-contest-157/problems/longest-arithmetic-subsequence-of-given-difference/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。