我想找到两个数字A,B之间的完美平方(数字可以是正数/负数)。我也希望实现O的时间复杂度(sqrt(abs(B)))。
我为此编写了以下代码:
count = (int)(Math.floor(Math.sqrt(Math.abs(B)) - Math.ceil(Math.sqrt(Math.abs(A))) + 1);
这通常效果很好但是当范围在-ve和+ ve数之间时会失败。
例如,范围是A = -1,B = 1.然后我认为它应该返回2(0,1)但返回1.
我在SO中的其他答案中找不到解决方案。所以,任何帮助将不胜感激。
答案 0 :(得分:3)
我们假设A,B≥0。
然后A≤n²≤B相当于√A≤n≤√B和ceil(√A)≤n≤floor(√B)。
因此,解决方案的数量为楼层(√B) - ceil(√A)+ 1.
如果A&lt; 0,将A替换为0.然后,如果B <0。 A,没有解决方案。
@Bathsheba更新:
最后,如果您不希望0被视为完美的正方形,则将“如果A <0,将A替换为0”替换为“如果A&lt; 1,则将A替换为1”。
答案 1 :(得分:1)
没有完美的正方形(除非我们将i
的数字从-infinity考虑为0.所以你可以/应该在负起始数上抛出IllegalArgumentException,或者只是将start设置为0。