LeetCode 面試題 16.24. 數對和 (雙指針、哈希表)

數對和
雙指針:

class Solution {
public:
    vector<vector<int>> pairSums(vector<int>& nums, int target)
    {
        vector<vector<int>> ans;
        sort(nums.begin(),nums.end());
        int l=0,r=nums.size()-1;
        while(l<r){
            int sum = nums[l]+nums[r];
            if(sum>target){
                r--;
            }else if(sum<target){
                l++;
            }else{
                ans.push_back(vector<int>{nums[l],nums[r]});
                l++;
                r--;
            }
        }
        return ans;
    }
};

哈希表的一般做法:

class Solution {
public:
    unordered_map<int,int> numbers;
    vector<vector<int>> ans;
    vector<vector<int>> pairSums(vector<int>& nums, int target) {
        for(int x:nums){
            if(!numbers.count(x)){
                numbers[x]=0;
            }
            numbers[x]++;
        }
        for(int x:nums){
            if(numbers[x]){
                numbers[x]--;
                if(numbers[target-x]){
                    numbers[target-x]--;
                    ans.push_back(vector<int>{x,target-x});   
                }else{
                    numbers[x]++;
                }
            }
        }
        return ans;
    }
};

或者只遍歷一次。

class Solution {
public:
    unordered_map<int,int> map;
    vector<vector<int>> ans;
    vector<vector<int>> pairSums(vector<int>& nums, int target) {
        for(int x:nums){
            if(map[target-x]){
                map[target-x]--;
                ans.push_back(vector<int>{x,target-x});
            }else{
                map[x]++;
            }
        }
        return ans;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章