给定一个非负整数
c
,你要判断是否存在两个整数a
和b
,使得a^2 + b^2 = c
。tips:整数包括0,两整数可以相同。
示例 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
//学完双指针兴冲冲地跑来用,应了评论区那句一顿操作猛如虎,提交超越百分五
//时间复杂度O(√C),空间复杂度O(√C)
class Solution {
public boolean judgeSquareSum(int c) {
//两数平方和等于c,那么两数必不大于sqrt(c)
int len=Integer.parseInt(new java.text.DecimalFormat("0").format(Math.sqrt(c)))+1;//Math.sqrt()结果是double,需要强制转换int,此处为无四舍五入转int,也可直接(int)Math.sqrt(c),四舍五入转int
int[] nums=new int[len];
for(int i=0;i<len;i++){
nums[i]=i;//创建一个数组来放置左右指针
}
int left=0,right=len-1,sum=0;
while(left<=right){
sum=nums[left]*nums[left]+nums[right]*nums[right];//换成c++,会发生整型溢出
if(sum<c)left++;
else if(sum>c)right--;
else {
return true;
}
}
return false;
}
}
//这是我自己的做法,很多地方很鸡肋。记录下来只是为了与后续题解区的解决方法进行比较
/**
题解里大佬写的双指针,好牛,一拳打掉98.25%。
时间复杂度最差O(√c),空间复杂度O(1)
和我的对比如下:
1.省去了用来指定左右指针的数组,直接设置初始值末尾值为左右指针
2.判定条件的优化 防止i*i+j*j的溢出情况发生
**/
class Solution {
public boolean judgeSquareSum(int c) {
int len=(int)Math.sqrt(c);
int i=0,j=len;
while(i<=j){
if(c-i*i>j*j)i++;
else if(c-i*i<j*j)j--;
else return true;
}
return false;
}
}
//官方解法一 sqrt算术平方根解法
//时间复杂度O(√c),空间复杂度O(1)。==是我技不如人
class Solution {
public boolean judgeSquareSum(int c) {
for(int a=0;c-a*a>=0;a++){
double b=Math.sqrt(c-a*a);
if(b==(int)b)return true;
}
return false;
}
}
//领悟到优化算法的办法真就是从条件和范围入手。
//官方解法二 二分法
class Solution {
public boolean judgeSquareSum(int c) {
for(long a=0;c-a*a>=0;a++){//如果不设置为long,会有溢出错误
int b=c-(int)(a*a);
if(binary_search(0,b,b)){
return true;
}
}
return false;
}
public boolean binary_search(long begin,long end,int sum){
if(begin>end)return false;
long mid=begin+(end-begin)/2;
if(mid*mid>sum) return binary_search(begin,mid-1,sum);
else if(mid*mid<sum) return binary_search(mid+1,end,sum);
else return true;
}
}
官方解法三 费马定理(我不懂,后续钻研后再作编辑)
public class Solution {
public boolean judgeSquareSum(int c) {
for (int i = 2; i * i <= c; i++) {
int count = 0;
if (c % i == 0) {
while (c % i == 0) {
count++;
c /= i;
}
if (i % 4 == 3 && count % 2 != 0)
return false;
}
}
return c % 4 != 3;
}
}作者:LeetCode
链接:https://leetcode-cn.com/problems/sum-of-square-numbers/solution/ping-fang-shu-zhi-he-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。