梦开始的地方——leetcode 1.两数之和

       前段日子学完c++基础知识,今天开始系统刷leetcode了,每天复盘一下自己的刷题进度及思考过程。加油!


2023.5.17

1、本人解法(暴力解ToT)

class Solution
{
public:
    vector<int> twoSum(vector<int>& nums, int target) 
    {
        vector<int> ans;
        for(int i=0;i<nums.size();i++)
        {
            for(int j=i+1;j<nums.size();j++)
            {
                if(nums[i]+nums[j]==target)
                {
                    ans.push_back(i);
                    ans.push_back(j);
                    return ans;
                }
            }
        }
        return {};
    }
};

        看到题目瞬间能想到的就是暴力解了,甚至暴力解过程中也出现了很多问题。 数组长度一开始我是用int len=sizeof(nums)/sizeof(nums[0]) 这种方法求出来的,但是一直报错,后面发现可以直接用nums.size()。

        然后就是要看清楚返回值,题目要求返回值的类型是vector<int> ,我一开始直接返回的 i和j,正确做法应该是建个vector,然后将i 和 j放进去,返回这个vector。 也可以直接返回{i,j} 。 

        最后的return{ } 也是必要的,不论找到元素与否总要有返回值的。

        看了下讨论区还看到一些别的解法,等有机会再重新做一下。

2、解法二:使用map(非哈希表)

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        vector<int> ans;
        map<int,int> mp;
        for(int i=0;i<nums.size();i++)
        {
            mp[nums[i]]=i;
        }
        for(int j=0;j<nums.size();j++)
        {
            if(mp.count(target-nums[j])==1 && mp[target-nums[j]]!=j)
            {
                ans.push_back(j);
                ans.push_back(mp[target-nums[j]]);
                return ans;
            }
        }
        return {};
    }
};

                          先复习一下之前学习的map容器的一些特点: 

  • map容器中的所有元素都是pair对,第一个元素为键值,第二个元素为实值。
  • map容器中的键值会自动排序。
  • map容器中的键值既不能重复也不能修改。

         

        这是学习别的博客的解法,利用map容器的键值唯一的特点,使用一个for循环将数组nums中的元素放入map容器的键值中,这样数组里相同的元素在map里不会重复,而map的实值存放索引值,(注意到map中重复的元素的索引值会被覆盖)。第二个for循环查找满足条件的索引,第一个条件是target-nums[j] 这个值在map中存在,第二个条件是 若存在,那么索引值不能是j,(如果是j那就不满足条件”数组中同一个元素在答案里不能重复出现“的要求了。满足条件的索引值push到vector中,最后返回vector。


2023.6.9

        最近学到哈希,今天来更新一下这道题的哈希解法。 直接上代码:

3、解法三:哈希法(unordered_map)

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) 
    {
        unordered_map<int,int> map; //以unordered_map为哈希结构
        for(int i=0; i<nums.size(); i++)
        {
            auto iter = map.find(target - nums[i]);
            if(iter != map.end())
            {
                return {iter->second , i};
            }
            map.insert(pair<int,int>(nums[i],i));
        }
        return {};
    }
};

        也复习了一下map相关的一些操作。

        这道题不需要有序,也不需要重复,所以选择速度最快的 unordered_map。


2023.9.14

        今天开始刷leetcode Hot 100题,加油。

        时隔三个月,三刷了。这题主要解法就是暴力解和哈希法。 下面再敲一次哈希解法:

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int,int>hash;
        for(int i=0; i<nums.size(); i++)
        {
            if(hash.find(target-nums[i]) != hash.end())
            {
                return {i , hash[target-nums[i]]};
            }
            hash[nums[i]] = i;
        }
        return {};
    }
};

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值