Leetcode 01两数之和 (python和c++)

本文深入探讨了经典的“两数之和”算法问题,提供了两种解决方案:穷举法和哈希法。通过C++与Python代码实现,对比了不同方法的效率与内存消耗,适合初学者理解算法思想。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。

你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

C++代码实现

(1)穷举法

执行用时:304 ms, 在所有 C++ 提交中击败了27.90%的用户

内存消耗:10 MB, 在所有 C++ 提交中击败了59.76%的用户

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

补充:关于vector大小(size)和容量(capacity)总结

(2)哈希

算法逻辑:使用哈希表存储数组内的所有值和索引对,然后组个遍历,查找另一个值是否在哈希表内即可。

执行用时:8 ms, 在所有 C++ 提交中击败了92.48%的用户

内存消耗:12.1 MB, 在所有 C++ 提交中击败了5.00%的用户

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) 
    {   
        // 哈希
        unordered_map<int,int> ha_val_idx;
        for(int i = 0; i < nums.size(); i++)
            ha_val_idx.insert(pair<int,int>(nums[i],i));
        
        for(int i = 0; i < nums.size(); i++)
        {
            int another = target-nums[i];
            // 存在,且不重复,即[1,2,3],target=4,不能是[2,2]
            // [3,3] 6. 返回:[0,1]
            if(ha_val_idx.count(another)>0 && (ha_val_idx[another]!=i))
                return {i, ha_val_idx[another]};
        }
        return {};

    }
};

python实现

执行用时:28 ms, 在所有 Python 提交中击败了56.72%的用户

内存消耗:13.5 MB, 在所有 Python 提交中击败了83.20%的用户

class Solution(object):
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        # 哈希表
        ha_value_idx = {}
        for i, val in enumerate(nums):
            ha_value_idx[val] = i
        
        for i, val in enumerate(nums):
            # 其中一个值为val,找另一个值target-val,该值即为哈希表的索引。
            j = ha_value_idx.get(target - val)
            if j is not None and i != j:  # 数组中同一个元素在答案里不能重复出现。
                return [i, j]
        return []

(3) 哈希

算法逻辑:一样使用哈希表,不过这里的哈希表用来存储已经访问过的数字及其对应的索引,初始时哈希表为空。这样当我们遍历数组时,可以快速查找当前元素与目标值之间的差值是否已经在哈希表中存在。如果存在,那么我们找到了一对解;如果不存在,则将当前元素加入到哈希表中继续搜索。

执行用时分布:0ms击败100.00%

消耗内存分布:14.07MB击败31.53%

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        std::unordered_map<int, int> lookup_table;
        for (int i = 0; i < nums.size(); ++i) {    
            // 另一个值是否在哈希表中
            if (lookup_table.find(target - nums[i]) != lookup_table.end()) {
                return {i, lookup_table[target - nums[i]]};
            }
            // 不在,则加入到哈希表,因为它的配对值可能还在数组中。
            lookup_table[nums[i]] = i;
        }
        return {};
    }
}; 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.Q

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值