bobo老师你好:
第一种方法:先排序,然后用双指针,时间复杂度应该为O(nlog(n)) [不确定自己有没有分析错]
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<pair<int,int>> newnums;
for(int i=0;i<nums.size();i++){
newnums.push_back(make_pair(nums[i],i));
}
sort(newnums.begin(),newnums.end(),[](pair<int,int> &l,pair<int,int> &r){return l.first<r.first;});
int i=0;
int j=nums.size()-1;
while (i<j) {
int sum=newnums[i].first+newnums[j].first;
if(sum==target){
return vector<int>{newnums[i].second,newnums[j].second};
}else if(sum>target){
j--;
}else{
i++;
}
}
throw ("error input");
}
};
leetcode 上提交,耗时8ms
第二种解法,使用hashmap,时间复杂度为O(n)
class Solution {
public:
vector twoSum(vector& nums, int target) {
unordered_map<int, int> m;
for(int i = 0; i < nums.size(); i++)
{
if(m.find(target-nums[i]) != m.end())
return {m[target-nums[i]], i};
m[nums[i]] = i;
}
throw("");
}
};
leetcode 上提交,耗时16ms
======================
为什么时间复杂度O(nlog(n))的耗时小于O(n)的?