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 {};
    }
    
    
};
相关推荐
Dlrb12111 小时前
C语言-指针数组与数组指针
c语言·数据结构·算法·指针·数组指针·指针数组·二级指针
WL_Aurora1 小时前
Python 算法基础篇之集合
python·算法
平行侠1 小时前
A15 工业路由器IP前缀高速检索与内存压缩系统
网络·tcp/ip·算法
阿旭超级学得完2 小时前
C++11包装器(function和bind)
java·开发语言·c++·算法·哈希算法·散列表
li星野2 小时前
位运算 & 数学 & 高频进阶九题通关(Python + C++)
c++·python·学习·算法
jerryinwuhan2 小时前
hello算法,简单讲(1)
算法·排序算法
y = xⁿ2 小时前
20天速通LeetCodeday15:BFS广度优先搜索
算法·宽度优先
400分2 小时前
吃透RAG核心-----语义检索与关键字检索底层原理
算法·架构
目黑live +wacyltd3 小时前
算法备案:常见驳回原因与应对策略
人工智能·算法
磊 子3 小时前
多态类原理+四种类型转换+异常处理
开发语言·c++·算法