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 分钟前
RUST基础1----数据类型
开发语言·算法·rust
卷福同学6 分钟前
Claude Code源码泄露:8大隐藏功能曝光
人工智能·后端·算法
阿豪学编程9 小时前
LeetCode724.:寻找数组的中心下标
算法·leetcode
墨韵流芳10 小时前
CCF-CSP第41次认证第三题——进程通信
c++·人工智能·算法·机器学习·csp·ccf
csdn_aspnet11 小时前
C# 求n边凸多边形的对角线数量(Find number of diagonals in n sided convex polygon)
开发语言·算法·c#
禹中一只鱼11 小时前
【力扣热题100学习笔记】 - 哈希
java·学习·leetcode·哈希算法
凌波粒11 小时前
LeetCode--349.两个数组的交集(哈希表)
java·算法·leetcode·散列表
paeamecium12 小时前
【PAT甲级真题】- Student List for Course (25)
数据结构·c++·算法·list·pat考试
Book思议-12 小时前
【数据结构】栈与队列全方位对比 + C 语言完整实现
c语言·数据结构·算法··队列
SteveSenna12 小时前
项目:Trossen Arm MuJoCo
人工智能·学习·算法