我一直在努力应对这个挑战:Count Triplets,经过大量的努力,我的算法并没有对每个测试用例都有效。
由于在讨论中,我已经看到了一个代码,并试图找出代码的真实的功能,我仍然不能理解,这段代码是如何工作的。
解决方案:
from collections import defaultdict
arr = [1,3,9,9,27,81]
r = 3
v2 = defaultdict(int)
v3 = defaultdict(int)
count = 0
for k in arr:
count += v3[k]
v3[k*r] += v2[k]
v2[k*r] += 1
print(count)
上面的代码可以完美地用于每个测试用例。我已经测试了k
,v2
,v3
的值,以理解但仍然不理解代码如何在计数三元组时工作得如此流畅。我在梦中也无法想到这种解决方案。我想知道人们是如何如此聪明地计算出这种解决方案的。尽管如此,如果能得到适当的解释,我会很高兴的。谢谢
k、v2、v3的输出
from collections import defaultdict
arr = [1,3,9,9,27,81]
r = 3
v2 = defaultdict(int)
v3 = defaultdict(int)
count = 0
for k in arr:
count += v3[k]
v3[k*r] += v2[k]
v2[k*r] += 1
print(k, count, v2, v3)
输出
6条答案
按热度按时间lvjbypge1#
1.问题
该函数有两个参数,即:
输入可以是
目标是返回构成等比级数的三胞胎的计数。
2.如何解决
解决这个问题的方法有很多,比如在comment from RobertsN的基础上,从SagunB
或者像你说的
3.最终结果
两个用例都将通过HackerRank中的所有当前13个测试用例
4.解释您的案例
RobertsN的注解很好地解释了你的代码(和你的代码很相似),不过,为了更好地理解代码是如何工作的,只需要打印出count、v2和v3的情况。
假设你的输入是
预期输出为
同样,我们知道根据定义,v2和v3看起来都像
这就留下了for循环来理解。可能会引起一些混乱的是运算符+=,但那是already addressed by me in another answer。
现在,为了理解剩下的部分,我们可以将循环改为
会让你看到
提取出想要的信息。我们能从中观察到什么呢?
最有可能的是,这个过程会引出问题,回答这些问题会让你更接近于理解它。
toiithl62#
所以当代码遍历数组时,它会跟踪潜在的对和对。
对于任意给定的k,三元组的数量是我们在此之前遇到的对于任意给定的k/r的对的数量,注意在整个循环中,v3[k]和v2[k]通常为零,直到它们达到我们在前一次迭代中预测的k*r值。
j2datikz3#
我一直在努力理解它,最后,这段C#代码应该很容易理解
zf2sa74q4#
最好通过例子来理解--假设我们有数组11111,并且i=3,所以111〉1〈1。
V2当前具有计数111,11〉1存在两个以〉1结束的对,对于长度(数组)=n,通常为n-1。
现在在v3,我们从v2递归地构造count,如下所示:对于创建的和用v2计数的每个对,我们指定最后一个分量,对于#pairs = n,存在n个这样的选项。
因此,对于i=3:
希望这有帮助!
1sbrub3j5#
数字
X
的潜在值:存在的三元组的数目(如果有的话)使用X作为完全形成三元组的优先级。让我们举一个例子:
1 2 4
与r = 2
的关系。S1:带有
1
:没有三元组,因为1/2=0.5和1/2/2=0.25不可用。请在散列表中添加1。S2:带有
2
:如果达到最后一个数字(4),则可以形成1个潜在的三元组。将2添加到散列表。S3:带有
4
:如果达到最后一个数字(8),可能会形成1个潜在的三元组。在散列表中添加4。同时,我们有1个三元组,因为4/2
和4/2/2
存在于散列表中。但是我们怎么知道只有
1
,因为要到达一个三元组的第4个,你必须经过第2个,而我们只有1
,第2个在第4个之前。所以总数是1。简单。
如果输入为
1 2 2 2 4
会怎样?我们有潜力:1:0; 2:1第一;4:3数字2 =〉3个三胞胎
将
1
添加到输入,我们得到:1 1 2 2 2 4
和r=2
对于第一个
2
,我们有2个潜在的三重态,因为在它之前有2
数字1。对于第二个
2
,我们有两个对于第三个
2
,我们有三个因此,总数为2(1号)x 3(2号)= 6个潜在三重态
当索引达到数字4时,类似于上面的步骤3,我们有总的三元组是6。
这是我们通过数组迭代的2个散列表的演示:
| 输入|潜力|计数|
| - ------|- ------|- ------|
| 一一二二二四|{1:0、2:6、4:3}|{1:2、2:3、4:1}|
| 1 1 2 2 2 4 8 16|{1:0、2:6、4:3、8:1、16:1}|{1:2、2:3、4:1、8:1、16:1 }|
作为上表中的第二个输入,我们可以说:
对于三重态数(1,2,4),我们有6个三重态(在数2处的势)
对于三重态数(2,4,8),我们有3个三重态(在数4处的势)
对于三重态数(4,8,16),我们有1个三重态(在数8处的势)
所以总共是10个三胞胎。
这是我的javascript解决方案
ctehm74n6#
可以是下面这样的想法。
几何级数的形式为:啊,啊,啊,...
现在考虑arr中的元素是否为:
1.元素== ARR或三元组的第三项意味着我们已经完成三元组,因此更新计数。
1.元素== AR或三元组的第二项,因此GP中的下一个元素将是(元素乘以R)ARR,并将在ARR或r3字典中更新。
1.元素== A或第一项,因此GP中的下一个元素将是(元素乘以R)AR,因此将在AR或r2字典中更新。