力扣1. 两数之和

Posted 幽殇默

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了力扣1. 两数之和相关的知识,希望对你有一定的参考价值。

在这里插入图片描述
https://leetcode-cn.com/problems/two-sum/
方法一:暴力 时间复杂度O(n2)

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        for(int i=0;i<nums.size();i++)
        {
            for(int j=i+1;j<nums.size();j++)
            {
                if(nums[i]+nums[j]==target)
                {
                    return {i,j};
                }
            }
        }
        return {};
    }
};

方法二:用哈希表,哈希表的查询时间在O(1),故总的时间复杂度为O(n)

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int,int> heap;
        for(int i=0;i<nums.size();i++)
        {
            int k=target-nums[i];
            if(heap.count(k)) return {heap[k],i};//哈希表中有
            heap[nums[i]]=i;
        }
        return {};
    }
};
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int,int> heap;
        for(int i=0;i<nums.size();i++)
        {
            int k=target-nums[i];
            if(heap[k]) return {heap[k]-1,i};
            heap[nums[i]]=i+1;//避免下标是0的情况,故统一加1 输出的时候再统一减1
        }
        return {};
    }
};

方法三: map map基于平衡树,查询的时间复杂度为O(logn)

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        map<int,int> heap;
        for(int i=0;i<nums.size();i++)
        {
            int k=target-nums[i];
            if(heap[k]) return {heap[k]-1,i};
            heap[nums[i]]=i+1;
        }
        return {};
    }
};

方法四: 双指针做法, 总的时间复杂度为O(nlogn+n)

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        vector< pair<int,int> > ve;
        for(int i=0;i<nums.size();i++) ve.push_back({nums[i],i});
	    sort(ve.begin(),ve.end());
        for(int i=0,j=nums.size()-1;i<j;i++)
        {
    	    while(ve[i].first+ve[j].first>target) j--;
    	    if(ve[i].first+ve[j].first==target)
    	    {
    		    return {ve[i].second,ve[j].second};
    	    }
        }
        return {};
    }
};

以上是关于力扣1. 两数之和的主要内容,如果未能解决你的问题,请参考以下文章

力扣1. 两数之和

两数之和 -- 力扣

力扣1两数之和

力扣1两数之和(Java)

力扣1两数之和(简单)

力扣题解 1th 两数之和