cppclass Solution { public: map<int,int>m; vector<int> twoSum(vector<int>& nums, int target) { for(int i=0;i<nums.size();i++) { m[nums[i]]=i; } sort(nums.begin(),nums.end()); for(int i=0;i<nums.size();i++) { int l=0,r=nums.size()-1; while(l<r) { int mid=l+r>>1; if(nums[mid]>=target-nums[i])r=mid; else l=mid+1; } if(nums[i]==target-nums[l]){ // cout<<m[target-nums[l]]<<endl<<target-nums[l]<<endl; return {m[nums[i]],m[nums[l]]}; } } return{}; } };当然可以两个循环遍历,上面我用的map+二分,发现如果元素重复的话就错误了,这里直接写一个findd函数代替找一下就好了:
cppclass Solution { public: map<int,int>m; int findd(int x,vector<int>& nums,int l,int k) { for(int i=l;i<k;i++) { if(nums[i]==x) { return i; } } return -1e7; } vector<int> twoSum(vector<int>& nums, int target) { vector<int>copy(nums); sort(copy.begin(),copy.end()); int a,b; for(int i=0;i<copy.size();i++) { int k; int l=0,r=copy.size()-1; while(l<r) { int mid=l+r>>1; if(copy[mid]>=target-copy[i])r=mid; else l=mid+1; } if(copy[i]==target-copy[l]){ // cout<<m[target-nums[l]]<<endl<<target-nums[l]<<endl; a=findd(copy[i],nums,0,nums.size()); b=findd(copy[l],nums,a+1,nums.size()); if(b==-1e7) { b=findd(copy[l],nums,0,a); } return{a,b}; } } return{}; } };下面的双指针也可以:
cppclass Solution { public: vector<int> twoSum(vector<int>& nums, int target) { vector<int>copy(nums); sort(copy.begin(),copy.end()); int l=0,r=nums.size()-1; while(l<r) { if(copy[l]+copy[r]>target)r--; if(copy[l]+copy[r]<target)l++; if(copy[l]+copy[r]==target)break; } // cout<<l<<" "<<r<<endl; vector<int>ans; for(int i=0;i<nums.size();i++) { if(nums[i]==copy[l]||nums[i]==copy[r])ans.push_back(i); } return ans; } };后来考虑了一下直接使用哈希表其实也可以做,代码如下:
cppclass Solution { public: map<int,int>m; vector<int> twoSum(vector<int>& nums, int target) { for(int i=1;i<nums.size();i++) { m[nums[0]]=0; if(m.count(target-nums[i])) { return {m[target-nums[i]],i}; } m[nums[i]]=i; } return {}; } };
leetcode-hot100-1.两数之和
丰海洋2026-02-18 9:44