代码随想录训练营打卡第七天

代码随想录: 代码随想录

454. 四数相加 II

class Solution {
public:
    int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
        int res = 0;
        map<int, int> map;
        for (auto a : nums1) {
            for (auto b : nums2) {
                map[a + b]++;
            }
        }
        for (auto c : nums3) {
            for (auto d : nums4) {
                if (map.find(-1 * (c + d))!= map.end()) {
                    res += map[-1 * (c + d)];
                }
            }
        }
        return res;
    }
};

疑问:

//1
if (map.find(-1 * (c + d)) != map.end()) {
    res += map[-1 * (c + d)];
}

// 2
auto it = map.find(-1 * (c + d));
if (it != map.end()) {
    res += it->second;
}

这两种做法有什么区别

以下是Claude sonnet 3.5的回答:

这两种做法在功能上是等价的,但在效率和代码风格上有一些微小的区别:

  1. 效率:

    第一种方法:

    if (map.find(-1 * (c + d))!= map.end()) {
        res += map[-1 * (c + d)];
    }
    
    

    这种方法实际上进行了两次查找操作:一次在find()中,另一次在使用[]操作符时。

    第二种方法:

    auto it = map.find(-1 * (c + d));
    if (it != map.end()) {
        res += it->second;
    }
    
    

    这种方法只进行了一次查找操作,然后直接使用找到的迭代器。

  2. 安全性:

    第一种方法中,如果键不存在,[]操作符会创建一个新的键值对。虽然在这个特定的情况下不会发生(因为我们已经检查了键是否存在),但这种用法可能在其他情况下导致意外行为。

    第二种方法更安全,因为它不会意外地创建新的键值对。

  3. 代码风格:

    第二种方法被认为是更好的C++风格。它更明确地表达了意图,并且避免了重复查找。

  4. 性能:

    对于std::map,两种方法的性能差异可能不太明显,因为std::map[]操作符通常被优化得很好。

    但对于std::unordered_map,第二种方法可能会有轻微的性能优势,因为它避免了第二次哈希计算。

总的来说,第二种方法(使用迭代器)是更推荐的做法。它更高效(只查找一次),更安全(不会意外创建新元素),并且符合 C++ 的惯用做法。在处理大量数据或者对性能要求较高的场景中,这种小的优化可能会产生明显的影响。

您对这个解释还有什么疑问吗?或者您想了解更多关于 C++ 容器操作的最佳实践?

383. 赎金信

class Solution {
public:
    bool canConstruct(string ransomNote, string magazine) {
        int a[26] = {0};
        for (auto c : magazine) {
            a[c - 'a']++;
        }
        for (auto c : ransomNote) {
            a[c - 'a']--;
            if (a[c - 'a'] < 0) {
                return false;
            }
        }
        return true;
    }
};

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值