昨天刚刷了个leetcode简单算法两数之和,结果发现自己第一遍耗时188ms(纯属暴力破解),如下为我的代码:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> two;
for(int i=0;i<nums.size()-1;++i)
{
for(int j=i+1;j<nums.size();++j)
{
if(nums[i]+nums[j]==target)
{
two.push_back(i);
two.push_back(j);
}
}
}
return two;
}
};
之后我查看了下一些高手的代码,耗时100ms的代码其实跟我的是一样的,只是可能测试的数据有些不同,不管这个,我在查看10ms的代码时,发现用map来实现:,如下为10ms的代码:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target)
{
vector<int> result;
unordered_map<int,int> ma;
for(int i=0;i<nums.size();i++)
{
ma[nums[i]]=i;
}
for(int j=0;j<nums.size();j++)
{
int t=target-nums[j];
if(ma.count(t)&&ma[t]!=j)
{
result.push_back(j);
result.push_back(ma[t]);
break;
}
}
return result;
}
};
发现时间复杂度为O(n),比起之前的n*logn小多了,但当我查看4ms的代码时,如下:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int i,j,nsize;
nsize=nums.size();
vector<int> result;
map<int,int> hmap;
for(i=0;i<nsize;i++){
if(hmap.find(target-nums[i])!=hmap.end()){
j=hmap[target-nums[i]];
result.push_back(j);
result.push_back(i);
break;
}
else
hmap[nums[i]]=i;
}
return result;
}
};
发现其实在查询时可以不用先给map赋值,可以边查询边赋值,这样在大数据的情况下大大节省了不少时间。
以上代码转载leetcode官网,仅供学习参考。