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循环中注释插入语句? 为什么我们使用一个集合?当我们使用一个集合时,我们忽略了存在于向量中的重复元素,我们不能使用一个映射吗?这样我们就不会在输入向量包含重复值的情况下丢失任何元素吗?
如果你把这两行去掉
//for(int el : a)
// s.insert(el);
意味着所有的元素都将被添加到开头。
k
是非负数,所以它可能会变成零。
因此,函数将给出忽略 i != j
条件,并给出假阳性,当 k
为零(搜索 A[i] = A[j]
).
当在循环内惰性时,在 s
赠予少于 i
.这是因为 i != j
条件在这种情况下不会被忽略.假设是这样,你不需要使用indice,否则,使用 map
不需要持有起诉书。