首页 / C# / c# – 查找数组中差异为K的对数?
c# – 查找数组中差异为K的对数?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 查找数组中差异为K的对数?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1271字,纯文字阅读大概需要2分钟。
内容图文
![c# – 查找数组中差异为K的对数?](/upload/InfoBanner/zyjiaocheng/806/d7cfcd8cb7af463ba0b1d0f91fce1855.jpg)
所以基本上我要做的就是
static int NumdiffExponential(int[] arr, int K)
{
return (from i in arr
from j in arr
where (j - i) == K
select 1).Count();
}
除了在线性时间内,优选地使用单个LINQ查询并且以紧凑,可读和微优的方式.所以我想出的是尝试
static int NumdiffLinear(int[] arr, int K)
{
var counters =
arr
.GroupBy(i => i)
.ToDictionary(g => g.Key, g => g.Count());
return
counters
.Keys
.Aggregate(
0,
(total, i) => total + counters[i] * (counters.ContainsKey(K - i) ? counters[K - i] : 0)
);
}
它一直出现为0,我无法弄清楚为什么.
让我解释一下我认为它是如何工作的.如果我们有arr = {1,1,1,2,3,3,5}和K = 2,那么计数器就像
1->3, 2->1, 3->2, 5->1
设count = 0.
我拿了键1,看到1-K = -1不是计数器中的键,因此count = 0.与键2相同.
对于键3,我们有3-K = 1,这是计数器中的键.密钥1出现3次(即计数器[3] = 1次,密钥2出现2次.因此,由于对(1,3),(1,3),(1),计数= 3 * 2 = 6可以形成,3),(1,3),(1,3),(1,3),(1,3).
通过与上面相同的逻辑,我们再添加一个因为对(3,5).所以答案是数= 7.
我的算法或其实现有什么问题吗?
解决方法:
您可以按如下方式修复解决方案,
public int NumdiffLinear(int[] arr, int K)
{
var dupsDictionary =
arr
.GroupBy(i => i)
.ToDictionary(g => g.Key, g => g.Count());
return dupsDictionary.Keys.Aggregate(
0,
(total, i) =>
total +
dupsDictionary.Keys.Where(key => i - key == K)
.Sum(key => dupsDictionary[key]*dupsDictionary[i]));
}
内容总结
以上是互联网集市为您收集整理的c# – 查找数组中差异为K的对数?全部内容,希望文章能够帮你解决c# – 查找数组中差异为K的对数?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。