@[yx100224](/user/920234)
你可以试试双指针
by xuzihao123 @ 2023-08-15 20:04:27
@[xuzihao123](/user/946929)
双指针是啥?(蒙逼ing)
by froth_reciprocal @ 2023-08-15 20:15:31
@[yx100224](/user/920234) 双指针差不多就是从前往后和从何往前一起搜索
by wjx38223 @ 2023-08-15 20:52:06
@[yx100224](/user/920234) 我觉得可以改成一个桶,降复杂度还好理解一点,这样子确实有点麻烦了
by wjx38223 @ 2023-08-15 20:55:13
@[wangjiaxin1234](/user/902704)
谢谢大佬,今天有点晚了,时间不多了,明天我要是不会,希望您可以在线解答,谢谢
by froth_reciprocal @ 2023-08-15 20:57:51
提供一种桶的写法吧,数组得开大一点
```cpp
for(int i = 1; i<=n; i++){
for(int j = i+1; j<=n; j++){
vis[a[i]+a[j]] = true;
}
}
for(int i = 1; i<=n; i++){
if(vis[a[i]]){
ans++;
}
}
```
vis数组类似于一个桶,用来存相加的结果,再去找原本的a数组里每个值在不在这些可能其中
by wjx38223 @ 2023-08-15 20:59:29
@[wangjiaxin1234](/user/902704)
不理解
``vis[a[i]+a[j]]=true;``
和
``if(vis[a[i]]) ans++;``
求讲,谢谢dalao
by froth_reciprocal @ 2023-08-16 07:51:04
同学,你的if里面标记应该vis[t]=1;
你写的是vis[j]=1;
改了就A了
by Lv_666 @ 2023-08-16 08:36:01
@[yx100224](/user/920234)
`a[i]+a[j]` 是**两个加数的和**,而在`vis`数组里记录则是标记这个结果,为了后边 _查找结果是否在原来的数组中也有出现_ 写的
`if(vis[a[i]]) ans++;`是在找数组中的这个元素有没有**作为一个和的结果出现**过,`a[i]`是这指要查询这个值
例如,a数组是{$1,2,3$}, $1+2$ 的结果是 $3$ ,那么在`vis`数组中标记 “3” 这个结果有出现,查找`vis[3]`,结果是`true`,说明在a数组中的确有两个加数和为 3, 那么这使最终答案`ans`加上1
by wjx38223 @ 2023-08-16 09:43:57
vis[a[i]+a[j]]=true;
就是说把a[i]+a[j]的和进行标记,再通过if(vis[a[i]]) ans++;判断是否存在两个数的和等于a[i],如果存在那么计数器(ans)累加
by pb0000 @ 2023-08-16 09:45:57