LintCode 697: 判断是否为平方数之和 -- O(n) 解法

问题

LintCode 697: 判断是否为平方数之和
给一个整数 c, 你需要判断是否存在两个整数 a 和 b 使得 a^2 + b^2 = c.

样例

给出 n = 5
返回 true // 1 * 1 + 2 * 2 = 5
给出 n = -5
返回 false

一般的解法,时间复杂度为 O( n 2 n^2 n2)。

下面的展示一种 时间复杂度为 O(n) 的算法。
其中加速的原理,主要是使用了 动态规则 的思想,减少了重复的计算。

平方数的递推公式

平方数可以由以下的图形来展示:

在这里插入图片描述

从图形中,可以归纳得出公式:

n 2 = 1 + 3 + 5 + . . . + ( 2 ∗ n − 1 ) n^2 = 1 + 3 + 5 + ... + (2*n - 1) n2=1+3+5+...+(2n1)
其中 n >= 1。

最后,我们得到计算平方数 f ( n ) = n 2 f(n) = n^2 f(n)=n2 的递推公式:

f ( n ) = { 1 当 n=1 时 f ( n − 1 ) + ( 2 ∗ n − 1 ) 当 n>1 时 f(n) = \begin{cases} 1 &\text{当 n=1 时} \\ f(n-1) + (2*n -1) &\text{当 n>1 时} \end{cases} f(n)={ 1f(n1)+(2n1) n=1  n>1 

平方数的判断

使用上面的 平方数的递推公式,可以写出判断函数:

bool check_perfext_square_number(unsigned int num)
{
   
	unsigned int step;
	unsigned int square = 0;
	unsigned int residual = num;
	for (step = 1; residual >= step; step += 2) {
   
		square += step; 
		residual -= step; 
	}
	return (0 == residual);
}

residual 为余数。开始的时候初始化赋值为 num
step 为步长。取值为 1,3,5,7,9 … 等等的奇数。

在每一次的循环中:

  1. square 会加上适当的 step始终保持为一个平方数
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值