学习目标:
我会持续更新我独特的算法思路,希望能给大家带来不一样的思维拓展!
如果大家感觉有帮助的话,欢迎点赞关注支持哦!
你们的鼓励是我坚持下去的动力!
!!!
力扣题库第633题 官方链接
学习内容:
平方数之和
给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = 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 <= 231 - 1
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sum-of-square-numbers
学习时间:
2022.1.16
学习产出:
思路一
解题思路
双指针法
1.指定两个指针,一个指向开始,一个指向结束。那么这里,我们求的是两个数的平方和是指定数
2.那么最大的数应该是目标数的开根号,然后加上一个比较小的数。比如5,应该是根号5,也就是2,然后2的平方加上1的平方组成目标值5
3.如果两个指针指向的数的平方和小于目标值,那么左指针应该右移。因为右指针不可能右移,如果加一了,那么平方值会大于目标值,所以左指针右移加一
4.如果两个指针指向的数的平方和大于目标值,此时应该让右指针左移。因为在此之前,也就是上一步的时候,左指针右移之前,两个指针指向的数的平方和小于目标值,而左指针右移之后,值就大于目标值了。证明此时,左指针无论怎么移,两个的平方和都不能为目标值,此时只能左移右指针,然后再判断。
5.还需要做一个越界判断,因为此时,如果两数平方和大于int型的最大值了,那么肯定是错误的,所以应该左移右指针
public class Solution {
public bool JudgeSquareSum(int c) {
if(c<0)return false;
int left=0;
int right=(int)Math.Sqrt(c);
while(left<=right){
int lefts=left*left;
int rights=right*right;
int res=lefts+rights;
if(res==c){
return true;
}else if(res>c||lefts>=(2147483647-rights)){
right--;
}else{
left++;
}
}
return false;
}
}
作者:荷兰猪小灰灰
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。