两数之和(Leetcode)

题目: alt

解法一:暴力法

        int n=nums.size();
        vector<int> ans;
        for(int i=0;i<n;++i)//从头到尾遍历数组
        {
            for(int j=i+1;j<n;++j)//从i的下一个位置开始查找,满足题目输出顺序的要求
            {
                if(nums[i]+nums[j]==target)
                {
                    ans.push_back(i);
                    ans.push_back(j);
                }
            }
        }
        return ans;
    }

最坏的情况是全部元素都需要遍历一遍,因此时间复杂度为O(N^2); 空间使用为常量级别,因此空间复杂度为O(1).

解法二:哈希法

        vector<int> ans;
        unordered_map<int,int> m;//C++11新特性加入的容器,底层为无序哈希表
        for(int i=0;i<nums.size();++i)
        {
            if(m.find(target-nums[i])!=m.end())//find函数如果失败返回为容器末尾迭代器
            {
                ans.push_back(m[target-nums[i]]);
                ans.push_back(i);
            }
            m[nums[i]]=i;
        }
        return ans;
    }

由于使用了哈希表查找,最差的情况是将N个元素放入到哈希表中,然后查找出来的时间只需要O(1),这个函数的时间复杂度为N*O(1),即O(N);

由于哈希表的使用,存入了N个元素,因此空间复杂度为O(N);

Leetcode刷题整合 文章被收录于专栏

都是作者刷到的一些感觉是好题整理到一起的,辛苦整理不易,麻烦给个赞,有疑问请留言

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务