leetcode-hot100-1.两数之和

cpp 复制代码
class 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函数代替找一下就好了:

cpp 复制代码
class 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{};
    }
};

下面的双指针也可以:

cpp 复制代码
class 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;

    }
};

后来考虑了一下直接使用哈希表其实也可以做,代码如下:

cpp 复制代码
class 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 {};
    }
    
    
};
相关推荐
哈里谢顿1 天前
跳表(Skip List):简单高效的有序数据结构
数据结构
CoovallyAIHub1 天前
181小时视频丢给GPT-5,准确率只有15%——南大联合NVIDIA等五校发布多模态终身理解数据集
深度学习·算法·计算机视觉
CoovallyAIHub1 天前
CVPR 2026 | GS-CLIP:3D几何先验+双流视觉融合,零样本工业缺陷检测新SOTA,四大3D工业数据集全面领先!
深度学习·算法·计算机视觉
xlp666hub2 天前
Leetcode 第三题:用C++解决最长连续序列
c++·leetcode
有意义2 天前
深度拆解分割等和子集:一维DP数组与倒序遍历的本质
前端·算法·面试
xlp666hub2 天前
Leetcode第二题:用 C++ 解决字母异位词分组
c++·leetcode
用户726876103372 天前
解放双手的健身助手:基于 Rokid AR 眼镜的运动计时应用
算法
Wect2 天前
LeetCode 17. 电话号码的字母组合:回溯算法入门实战
前端·算法·typescript
xlp666hub2 天前
Leetcode第一题:用C++解决两数之和问题
c++·leetcode