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 {};
    }
    
    
};
相关推荐
罗湖老棍子9 小时前
【例 1】Sightseeing Trip(信息学奥赛一本通- P1494)(洛谷-P10927)
数据结构·算法·图论·最短路·floyd·最小环
文丑颜不良啊10 小时前
LeetCode201~225题目解析
java·leetcode
stsdddd11 小时前
YOLO算法建筑工地安全帽目标检测数据集16881张:标注核对笔记
算法·yolo·目标检测
CV爱数码12 小时前
论文精读|Learned Primal-Dual:把原始–对偶算法展开成网络
图像处理·算法·计算机视觉·ct·重建·断层扫描
yuniko-n12 小时前
【算法】约瑟夫环问题
java·算法
郝亚军13 小时前
manifest 中 `sha256` 与 `signValue` 的作用
java·开发语言·数据结构
l1t13 小时前
测试DuckDB v2.1.0-alpha49002的bignum乘法
数据库·sql·算法·duckdb
Nil20813 小时前
LeetCode 283移动零
数据结构·算法·leetcode
CQU_JIAKE13 小时前
10.18【A】
算法
LMT流氓兔14 小时前
第五单元——第4课:给工具参数加校验
java·前端·算法·ai·langchain