题目链接: 两数之和

这个题我们可以简单的想到暴力枚举的方案,让所有的数字两两组合,如果等于目标值.就返回对应的索引.

  • python代码如下:

    class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        n=len(nums)
        for i in range(n):
            for j in range(i+1,n):
                if nums[i]+nums[j]==target:
                    return [i,j]        
    
  • c++代码如下:

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

但是这里使用了双层循环.时间复杂度是O($n^2$).我们就可以换个角度看能不能优化一下.既然我们要找x+y=target.那遍历数组,就是要找y=target-x.

但是如果使用查找算法,去查找每一个y,那么时间复杂度也很高,这时候我们就可以使用哈希表了.每遍历一个元素x,如果哈希表里有对应的y,就直接返回两个数的索引,如果没有,就把这个数作为键,把索引作为值存进哈希表.那么时间复杂度就可以优化到O(n)的一个时间复杂度.

  • python代码如下:

    class Solution:
        def twoSum(self, nums: List[int], target: int) -> List[int]:
            n=len(nums)
            hs=dict()
            for i in range(n):
                y=target-nums[i]
                if y in hs:
                    return [i,hs[y]]
                hs[nums[i]]=i
    
  • C++代码如下:

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