在Leetcode中使用set解决Diffk II问题时输出错误。为什么要用集合来解决这个问题?

问题描述 投票:0回答:1

Diffk II问题是:给定一个整数数组A和另一个非负整数k,求是否存在2个指数i和j,即A[i] - A[j] = k,i !

我在网上找到的代码是 。

if (a.size() < 2 || k < 0) return 0;
    set<int> s;
    //for(int el : a)
      //  s.insert(el);
    for(int i=0;i<a.size();i++)
    {
        int diff1 = a[i]-k;
        int diff2 = k+a[i];
        if(s.find(diff1)!=s.end())
            return 1;
        if(s.find(diff2)!=s.end())
            return 1;
         s.insert(a[i]);
    }
    return 0;

为什么我没有得到正确的输出,如果取消开头的2行注释,并在for循环中注释插入语句? 为什么我们使用一个集合?当我们使用一个集合时,我们忽略了存在于向量中的重复元素,我们不能使用一个映射吗?这样我们就不会在输入向量包含重复值的情况下丢失任何元素吗?

c++ set
1个回答
1
投票

如果你把这两行去掉

    //for(int el : a)
      //  s.insert(el);

意味着所有的元素都将被添加到开头。

k 是非负数,所以它可能会变成零。

因此,函数将给出忽略 i != j 条件,并给出假阳性,当 k 为零(搜索 A[i] = A[j]).

当在循环内惰性时,在 s 赠予少于 i.这是因为 i != j 条件在这种情况下不会被忽略.假设是这样,你不需要使用indice,否则,使用 map 不需要持有起诉书。

© www.soinside.com 2019 - 2024. All rights reserved.