leetcode刷题1.两数之和(c++)解题思维及代码

 leetcode刷题1.两数之和(c++)解题思维及代码_第1张图片

目录

解题思路

1.1自己的思路

1.2别人的思路

1.3经验

1.4相关知识点

2.代码

2.1优秀代码

2.2根据别人的代码修改后​

2.3原始代码


解题思路

1.1自己的思路

查找问题、数组类型

nums[i]+nums[j]==target,求i,j;

对于nums[i],需要nums[i:end]中找出nums[j]是存在的就可以

需要注意:查找只能在nums[i:end],避免出现一组数据反复被查出。

1.2别人的思路

哈希表(key-value):key=target-nums[i],value=i

当一个nums[j]找哈希表中被找到,说明找到一组和为目标值的数,在需返回的数组中存入value和j。

查找范围[nums[0],nums[i]]

1.3经验

少弄些变量和无用操作来增多运行时间

1.4相关知识点

1.vector了解.https://blog.csdn.net/weixin_41743247/article/details/90635931

      vector是一个能够存放任意类型的动态数组,可以动态改变大小

      函数:

       nums.begin()/nums.end()=>数组的开头元素和结尾元素

       find(begin,end,target):在[begin:end]中找到target就返回,不需遍历完

       count(begin,end,target):遍历[begin:end]完才返回

map.find和count与上述一致

2.map数组插入问题

map中所有关键字只能有唯一键值,Map的四种插入方式:

leetcode刷题1.两数之和(c++)解题思维及代码_第2张图片

来源:https://www.cnblogs.com/tianzeng/p/9017148.html

2.代码

2.1优秀代码

https://leetcode-cn.com/problems/two-sum/solution/

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

leetcode刷题1.两数之和(c++)解题思维及代码_第3张图片

2.2根据别人的代码修改后

class Solution {
public:
    vector twoSum(vector& nums, int target) {
        int index=0;    //j
        vector::iterator now=nums.begin();   //定位nums[i]
        for(int i =0;i::iterator it=find(now,nums.end(),target-nums[i]);
            if(it!=nums.end()){
                index=&*it-&nums[0];//
                return{index,i};               
            }            
        }
        return {};
    }
};

leetcode刷题1.两数之和(c++)解题思维及代码_第4张图片

2.3原始代码

class Solution {
public:
    vector twoSum(vector& nums, int target) {
        int num=0;      //nums[j]  //去掉这个提高10%->25%
        int index=0;    //j
        vector result;  //返回的结果   //
        vector::iterator now=nums.begin();   //定位nums[i]
        for(int i =0;i::iterator it=find(now,nums.end(),num);
            if(it!=nums.end()){
                index=&*it-&nums[0];//
                result.push_back(i);       //去掉这两句提升70%
                result.push_back(index);   //                
            }            
        }
        return result;
    }
};

leetcode刷题1.两数之和(c++)解题思维及代码_第5张图片

 

 

 

 

 

 

 

你可能感兴趣的:(leetcode,leetcode,c++)