Algorithm 最后k位之和与前k位之和相同
我想知道给定范围内少数数字的前k位和是否等于最后k位的和。这里的范围非常大,k小于20Algorithm 最后k位之和与前k位之和相同,algorithm,Algorithm,我想知道给定范围内少数数字的前k位和是否等于最后k位的和。这里的范围非常大,k小于20 我们能做到这一点的一种方法是使用暴力手段。有人能推荐一些其他有效的算法吗。同样的?蛮力法的一个理论改进: 1) 将前k位相加,存储在sumFirst 2) 对最后k位进行求和,但如果求和超过sumFirst, 第2点可以节省最后几个数字的总和 但是,你必须衡量,如果额外的逻辑,成本比简单地增加所有的k位 蛮力法的一个理论改进: 1) 将前k位相加,存储在sumFirst 2) 对最后k位进行求和,但如果求和超
我们能做到这一点的一种方法是使用暴力手段。有人能推荐一些其他有效的算法吗。同样的?蛮力法的一个理论改进: 1) 将前k位相加,存储在
sumFirst
2) 对最后k位进行求和,但如果求和超过
sumFirst
,第2点可以节省最后几个数字的总和
但是,你必须衡量,如果额外的逻辑,成本比简单地增加所有的k位 蛮力法的一个理论改进: 1) 将前k位相加,存储在
sumFirst
2) 对最后k位进行求和,但如果求和超过
sumFirst
,第2点可以节省最后几个数字的总和
但是,你必须衡量,如果额外的逻辑,成本比简单地增加所有的k位 对暴力的另一个改进:
i = 0, T = 0
while |T| < 9 * (k - i)
T = T + last[i] - first[i]
i = i + 1
return T == 0
i=0,T=0
而| T |<9*(k-i)
T=T+last[i]-first[i]
i=i+1
返回T==0
对暴力的另一项改进:
i = 0, T = 0
while |T| < 9 * (k - i)
T = T + last[i] - first[i]
i = i + 1
return T == 0
i=0,T=0
而| T |<9*(k-i)
T=T+last[i]-first[i]
i=i+1
返回T==0
优化N-k
改进算法的一种方法是,如果具有N个数字的数字具有以下属性:N<2k
例如,如果N=5和k=3,5<2x3
,则数字为
abcde
您只需根据de
计算ab
(即无需检查k
(3)个数字,因为第3个数字由k个最后数字和k个第一数字共享)。换句话说,两边要计算的数字数仅为
min(k, N-k), having N >= k
优化N-k
改进算法的一种方法是,如果具有N个数字的数字具有以下属性:N<2k
例如,如果N=5和k=3,5<2x3
,则数字为
abcde
您只需根据de
计算ab
(即无需检查k
(3)个数字,因为第3个数字由k个最后数字和k个第一数字共享)。换句话说,两边要计算的数字数仅为
min(k, N-k), having N >= k
如果是一个范围,则第一个数字不会经常更改,最后一个数字将以简单的方式更改。S是前20位数字的和。虽然第二个数字不变,但当您转到下一个数字时,总和将增加1。所以,如果你所有的数字,除了最后一个,都是固定的,如果最后一个数字等于i的和是Si,那么唯一好的最后一个数字就是n=S-Si+i。然后,您必须检查n是否在0和9之间,以及结果数字是否在间隔内。这将使查找次数减少10次 您可以检查下一个secund低位。
如果第一个n小于0,则需要将第二个und数字减少-n。把这个数字叫做第二个数字。如果n2>=0,好的数字将以(n2,0),(n2-1,1),…,(0,n2)结尾。这将复杂性降低100。
如果n大于10,则将第二位数增加n-9。拨打第二个数字。如果n2如果它是一个范围,则第一个数字不会经常更改,最后一个数字将以简单的方式更改。S是前20位数字的和。虽然第二个数字不变,但当您转到下一个数字时,总和将增加1。所以,如果你所有的数字,除了最后一个,都是固定的,如果最后一个数字等于i的和是Si,那么唯一好的最后一个数字就是n=S-Si+i。然后,您必须检查n是否在0和9之间,以及结果数字是否在间隔内。这将使查找次数减少10次 您可以检查下一个secund低位。
如果第一个n小于0,则需要将第二个und数字减少-n。把这个数字叫做第二个数字。如果n2>=0,好的数字将以(n2,0),(n2-1,1),…,(0,n2)结尾。这将复杂性降低100。
如果n大于10,则将第二位数增加n-9。拨打第二个数字。如果n2如果要对同一数组多次使用,则可以将所有元素与前面的元素相加,即
O(n)
,其中数组的大小为n
,即
for(int i = 1; i < n; i++)
arr[i] = arr[i] + arr[i-1];
如果要对同一数组多次使用该值,可以将所有元素与前面的元素相加,即
O(n)
,其中数组的大小为n
,即
for(int i = 1; i < n; i++)
arr[i] = arr[i] + arr[i-1];
你能举例说明吗?@HamZa为什么?你不明白什么?谁需要这个?对于哪个应用程序,您需要一个比直接forwars更好的解决方案?您所说的“给定范围内的少数数字”的含义仍然不清楚。您是否需要比较n,n+1,n+2。。。m(你打算只使用同一个数组一次还是多次?你能用一些例子说明一下吗?@HamZa为什么?你不明白什么?谁需要它?对于哪个应用程序,你需要一个比直接forwars更好的解决方案?你所说的“给定范围内的少数数字”是什么意思还不清楚.您是否需要比较n,n+1,n+2,…m中所有数字的前k位和后k位之和(您是否只使用同一个数组一次或多次?如果原始问题明确说明“给定范围内的少数数字”是否有其他限制,则有更多的改进方法。因此有必要澄清这个问题。这并不是说平均可以节省50%。如果超过总和,通常会在接近尾声时发生,因此节省会更接近于零。@interjay你是对的,我已经更新了。可能你无法通过算法手段来改进蛮力。如果最初的问题清楚地表明,是否对“一个国家中的少数几个数字”有额外的限制