力扣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. 两数之和的主要内容,如果未能解决你的问题,请参考以下文章