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 {};
    }
    
    
};
相关推荐
三毛的二哥2 小时前
BEV:典型BEV算法总结
人工智能·算法·计算机视觉·3d
南宫萧幕2 小时前
自控PID+MATLAB仿真+混动P0/P1/P2/P3/P4构型
算法·机器学习·matlab·simulink·控制·pid
故事和你913 小时前
洛谷-数据结构1-4-图的基本应用1
开发语言·数据结构·算法·深度优先·动态规划·图论
我叫黑大帅4 小时前
为什么map查找时间复杂度是O(1)?
后端·算法·面试
炽烈小老头4 小时前
【每天学习一点算法 2026/04/20】除自身以外数组的乘积
学习·算法
skilllite作者5 小时前
AI agent 的 Assistant Auto LLM Routing 规划的思考
网络·人工智能·算法·rust·openclaw·agentskills
破浪前行·吴5 小时前
数据结构概述
数据结构·学习
py有趣6 小时前
力扣热门100题之不同路径
算法·leetcode
_日拱一卒6 小时前
LeetCode:25K个一组翻转链表
算法·leetcode·链表
啊哦呃咦唔鱼6 小时前
LeetCodehot100-394 字符串解码
算法