甲骨文面试中问的问题。例如,如果我输入的是6,则
因此,最终答案应为3。(即,需要3,2,1才能得出总和6)
注意:不允许重复数字(即1 + 1 + 1 + 1 + 1 + 1 = 6)
我使用递归解决了问题,但面试官并不满意。动态编程可行吗?
最佳答案
我正要发布答案,但@Cruise Liu击败了我。虐待尝试解释一下。
它是整数分区的一种类型,但是您不需要生成元素,因为您仅对“元素数”感兴趣。即最终答案3,而不是{1,2,3}
给定数字N,您还有另一个限制,即数字不能重复。
因此,最好的情况是N实际上是一个数字,例如1、3、6、10、15
i.e. f(x) = x * (x + 1) / 2.
例如,取6。f(x)= 6存在。特别是f(3)= 6。这样就得到了答案3。
这意味着,如果对于f(x)= N,存在一个整数X,则存在一组数字1,2,3 ... x,它们相加后得出N。这是最大数可能的(没有重新定位)。
但是,在f(x)= N的情况下,x不是整数。
f(x) = x * (x + 1 ) / 2 = N
i.e. x**2 + x = 2*N
x**2 + x - 2*N = 0
解决这个二次方程式,我们得到
由于x不是负数,所以我们不能
所以我们留下了
对于N = 6
完美的整数。但是对于N = 12
这是8.845/2这是一个分数。底值是4,这就是答案。
简而言之:实现一个功能
f(N)=(整数)((-1.0 + sqrt(1 + 8 * N))/2.0)
IE。
int max_partition_length(int n){
return (int)((-1.0 + sqrt(1 + n*8))/2);
}
关于c - 给定n,求出获得n的最大数量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21656650/