平方数之和(c++)
问题描述:给定一个非负整数
c
,你要判断是否存在两个整数a
和b
,使得a^2 + b^2 = c
。示例 1:
输入:c = 5 输出:true 解释:1 * 1 + 2 * 2 = 5 示例 2:
输入:c = 3 输出:false 示例 3:
输入:c = 4 输出:true 示例 4:
输入:c = 2 输出:true 示例 5:
输入:c = 1 输出:true
提示:
0 <= c <= 2^31 - 1
方法(一)利用sqrt函数
首先值得注意的是提示部分:0 <= c <= 2^31 - 1,所以在定义变量时要定义成long型,避免溢出。
要减少时间复杂度就需要减少循环的用量,这里最好避免使用两层循环,并且用sqrt()函数减少循环次数:
for(long a=0;a*a<=c;a++){
double b=sqrt(c-a*a);
if(b==(int)b)//如果b为整数则返回true
return true;
}
全部代码为:
for (long a = 0; a * a <= c; a++) {
double b = sqrt(c - a * a);
if (b == (int)b) {
return true;
}
}
return false;
方法(二)双指针法
left和right分别表示平方数的左右边界的值,0<=left<=right,right<=sqrt(c)
于是有:
-
left^2+right^2=c,返回true
-
left^2+right^2<c,下界过小需要增大,left++,继续查找
-
left^2+right^2>c,上界过大需要减小,right--,继续查找
如下代码:
long left=0;
long right=(int)sqrt(c);
while(left<=right){
long sum=left*left+right*right;
if(sum==c){
return true;
}else if(sum<c){
left++;
}else{
right--;
}
}
return false;
时间复杂度:O(sqrt(c)),最坏的情况下left和right枚举了0到sqrt(c)中所有的数。
新认识的一些常用快捷键
-
Ctrl+A 全选
-
shift+delete 永久删除
-
ALT+F4 关闭窗口
-
window+TAB 切换任务
-
window+R 运行(找CMD命令)
-
window+E 打开我电脑
-
Ctrl+shift+ESC 任务管理器
基本的Dos命令
#盘符切换 盘名:
#查看当前目录下的所有文件 dir
#切换命令 cd cd..返回上一级
#清空屏幕 cls
#退出终端 exit
#查看电脑的ip ipconfig
#文件操作
md 创建目录
rd 移除目录
cd> 创建文件
del 删除文件