leetcode 1.两数之和

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


2023.5.17

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

class Solution
{
public:
    vector twoSum(vector& nums, int target) 
    {
        vector ans;
        for(int i=0;i

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

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

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

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

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

class Solution {
public:
    vector twoSum(vector& nums, int target) {
        vector ans;
        map mp;
        for(int i=0;i

                          先复习一下之前学习的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 twoSum(vector& nums, int target) 
    {
        unordered_map map; //以unordered_map为哈希结构
        for(int i=0; isecond , i};
            }
            map.insert(pair(nums[i],i));
        }
        return {};
    }
};

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

leetcode 1.两数之和_第1张图片

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

你可能感兴趣的:(leetcode专栏,力扣,c++,算法,学习,leetcode)