美文网首页
leetcode1. Two Sum

leetcode1. Two Sum

作者: mztkenan | 来源:发表于2017-06-09 10:06 被阅读44次

    给定区间[-231, 231]内的3个整数A、B和C,请判断A+B是否大于C。

    c++暴力破解

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

    python暴力破解

    class Solution(object):
        def twoSum(self, nums, target):
            """
            :type nums: List[int]
            :type target: int
            :rtype: List[int]
            """
            ans=[]
            for i in xrange(nums.__len__()):
                for j in xrange(nums.__len__()):
                    if(j>i and nums[i]+nums[j]==target):
                        ans.append(i)
                        ans.append(j)
                        return ans
            
    

    pytnon使用map

    class Solution(object):
        def twoSum(self, nums, target):
            """
            :type nums: List[int]
            :type target: int
            :rtype: List[int]
            """
            ans=[]
            map = {}
            for i in range(nums.__len__()):
                map[(target-nums[i])]=i
                print map
            for i in range(nums.__len__()):
                if(map.get(nums[i]) and i !=map.get(nums[i]) ):
                ans=[]
                ans.append(i)
                ans.append(map.get(nums[i]))
                return ans
                
         
    

    c++使用map v1.0

    class Solution {
    public:
        vector<int> twoSum(vector<int>& nums, int target) {
            vector<int> result;
            map<int,int> temp;
            for (int i=0;i<nums.size();i++)
            {
                temp[target-nums[i]]=i;
            }
    
            for (int i=0;i<nums.size();i++)
            {
                cout<<nums[i]<<endl;
                if(temp.find(nums[i])!=temp.end()&&i!=temp[nums[i]]){//这个地方顺序很重要,原先一直报错,原因在于temp[nums[i]]若是不存在会自动插入
                    result.push_back(i);
                    result.push_back(temp[nums[i]]);
    
                    return result;
                }
            }
        }
    };
    

    c++使用map v2.0

    这个版本在一个n循环都不到的时间中就可以实现

        vector<int> twoSum(vector<int>& nums, int target) {
            vector<int> result;
            map<int,int> temp;
            for (int i=0;i<nums.size();i++)
            {
                if (temp.count(target-nums[i])&&i!=temp[target-nums[i]]){
                    result.push_back(temp[target-nums[i]]);//temp[target-nums[i]]肯定在前面
                    result.push_back(i);    //i肯定在后面
                    return result;
                }
                temp[nums[i]]=i;
            }
        }
    

    注意事项

    1.使用map会使得效率提高很多,主要是特殊的数据结构使得查找的效率很高
    2.java中的hashMap底层用了hash表,TreeMap用了红黑树,python中的dict{}应该是采用哈希表,最低能在O(1)时间内完成搜索,c++中map使用的应该是红黑树
    3.temp[nums[i]]这里要注意,若是不存在的话会自动插入0,就是一个简单的cout<<temp[4],都会添加一个新元素导致很隐秘的错误。。。。

    参考资料

    1.python的dict实现[http://www.jianshu.com/p/02af9673ab34]
    2.Java HashMap工作原理及实现
    [http://yikun.github.io/2015/04/01/Java-HashMap%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86%E5%8F%8A%E5%AE%9E%E7%8E%B0/]

    相关文章

      网友评论

          本文标题:leetcode1. Two Sum

          本文链接:https://www.haomeiwen.com/subject/vkuxfxtx.html