哲学代码人 2024-03-16 21:26 采纳率: 100%
浏览 11
已结题

力扣1 两数之和 中关于 key 值重复的疑问

力扣 1. 两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

示例 1:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:

输入:nums = [3,2,4], target = 6
输出:[1,2]
示例 3:

输入:nums = [3,3], target = 6
输出:[0,1]

以下是官方给的题解 是以数组元素作为key,以元素的数组下标作为value 但是map中的key不是不能重复吗,以数组元素作为key 万一数组中有重复元素不久导致key重复了吗,而且题干给的第三组输入的数组就有重复的元素

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int, int> hashtable;
        for (int i = 0; i < nums.size(); ++i) {
            auto it = hashtable.find(target - nums[i]);
            if (it != hashtable.end()) {
                return {it->second, i};
            }
            hashtable[nums[i]] = i;
        }
        return {};
    }
};
  • 写回答

7条回答 默认 最新

  • 进朱者赤 新星创作者: 编程框架技术领域 2024-04-07 23:31
    关注

    题目中的数组元素可能存在重复,所以不能直接以数组元素作为哈希表的键。正确的做法是将数组元素作为值,数组的索引作为键。以下是修正后的C++代码实现:

    #include <vector>
    #include <unordered_map>
    using namespace std;
    
    class Solution {
    public:
        vector<int> twoSum(vector<int>& nums, int target) {
            unordered_map<int, int> hashtable;
            for (int i = 0; i < nums.size(); ++i) {
                int complement = target - nums[i];
                if (hashtable.count(complement)) { // 使用count来判断键是否存在
                    return {hashtable[complement], i};
                }
                hashtable[nums[i]] = i;
            }
            return {};
        }
    };
    在修正后的代码中,我们使用了无序哈希表unordered_map,将数组的值存储为键,将数组的索引存储为值。在遍历数组时,查找是否存在target - nums[i],如果存在则返回对应的索引和当前索引 i。如果不存在,则将当前元素及其索引加入哈希表。修正后的代码能够正确处理了数组中可能存在的重复元素。对于题目中的示例输入 [3, 3],只会在哈希表中存储一条记录,而不会导致重复的键。
    
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

问题事件

  • 系统已结题 4月16日
  • 已采纳回答 4月8日
  • 创建了问题 3月16日