给出一个金字塔:
0
1 2
3 4 5
6 7 8 9
...
并给出金字塔i
的索引,其中i
代表金字塔的i
个数字,是否有办法找到i
行的索引1}}元素属于哪个? (例如,如果i = 6,7,8,9
,则它位于第3行,从第0行开始)
答案 0 :(得分:5)
行号和三角数之间有联系。 nth triangular number,表示为T n ,由T n = n(n-1)/ 2给出。第一对三角形数字是0,1,3,6,10,15等,如果你注意到,每行的开头都是由第n个三角形数字给出的(它们来自这个三角形的事实是这个名字的来源。)
实际上,这里的目标是确定最大的n,使得T n ≤i。没有做任何聪明的数学,你可以通过计算T 0 ,T 1 ,T 2 在时间O(√n)中解决这个问题,等到你找到比我更大的东西。更好的是,您可以通过计算T 1 ,T 2 ,T 4 ,T <,在时间O(log n)中二进制搜索它。 sub> 8 等等,直到你超调,然后二进制搜索你找到的范围。
或者,我们可以尝试直接解决这个问题。假设我们想要找到n的选择
n(n + 1)/ 2 = i
扩展,我们得到
n 2 / 2 + n / 2 = i。
同样地,
n 2 / 2 + n / 2 - i = 0,
或更容易:
n 2 + n - 2i = 0。
现在我们使用二次公式:
n =( - 1±√(1 + 8i))/ 2
我们可以忽略的负根,所以我们想要的n的值是
n =( - 1 +√(1 + 8i))/ 2。
这个数字不一定是整数,所以为了找到你想要的行,我们只需向下舍入:
row =⌊(-1 +√(1 + 8i))/2⌋。
在代码中:
int row = int((-1 + sqrt(1 + 8 * i)) / 2);
让我们通过测试一下来确认这是有效的。 9去哪儿了?好吧,我们有
( - 1 +√(1 + 72))/ 2 =( - 1 +√73)/ 2 = 3.77
四舍五入,我们看到它排在第3行 - 这是正确的!
尝试另一个,55去哪儿了?那么,
( - 1 +√(1 + 440))/ 2 =(√441 - 1)/ 2 = 10
所以它应该在第10行。第十个三角形数字是T 10 = 55,所以事实上,55从该行开始。看起来很有效!
答案 1 :(得分:0)
我认为if(one === '') // compare with empty string directly, I recommend this
if(!one) // check if "falsy" (which for strings mean empty)
if(one.length === 0) // check if string has no length
元素属于i
行n
是n
的数量
例如,如果n(n+1)/2 <= i < (n+1)(n+2)/2
,则为i = 6
,因为n = 3
如果是n(n+1)/2 <= 6
,那么i = 8
因为n = 3
答案 2 :(得分:0)
我得到row = math.floor(√(2i + 0.25) - 0.5)其中i是你的号码
基本上与上面的那个人相同,但我将n 2 + n减少到(n + 0.5) 2 - 0.25