給定未排序數組(可能有重複元素),找出和爲給定值的所有二元組元素的下標

題目

給定一個未排序數組(可能有重複元素),找出和爲給定值的所有二元組元素的下標
例如:數組{2, 1, 2,3, 4, 0 }, target = 5
答案:{{0, 3},{ 2, 3}, {1,4} }
要求,時間複雜度爲O(n),空間複雜度O(n)

思路

網上類似的題目是已排序的數組,通過雙指針就可以解決,空間複雜度可以控制在O(1),而未排序的數組需要保存已遍歷元素的信息,可以考慮使用map進行存儲,這樣每次查詢的時候時間複雜度可以控制在O(1)

使用unordered_map<int, vector> m 進行已遍歷元素的存儲,key 值爲已遍歷數組元素值value值爲該元素出現的下標次數因爲有重複元素,用vector存儲下標)。

遍歷到第i個元素**nums[i]的時候,查詢target-nums[i]**是否已出現,出現則說明該可以組成題目要求的二元組

遍歷n個元素,時間複雜度爲O(n)

實現

void findpair(vector<int> & nums, int target)
{
    unordered_map<int, vector<int>> m;
    int n = nums.size();
    for(int i = 0; i<n; ++i) {
        int sub = target - nums[i];
        if(m.count(sub) > 0) {
            for(auto iter : m[sub]) {
                cout<<iter << " "<< i<< endl;
            }
        }
        if(m.count(nums[i]) == 0) {
            m.insert(pair<int, vector<int>> (nums[i], {i}));
        }else
            m[nums[i]].push_back(i);
    }
}

int main()
{
    vector<int> nums = {2, 1, 2, 3, 3, 5, 0};
    int target = 5;

    findpair(nums, target);

    return 0;
}


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