力扣刷题百天计划 Day8 平方数之和

学习目标:

我会持续更新我独特的算法思路,希望能给大家带来不一样的思维拓展!
如果大家感觉有帮助的话,欢迎点赞关注支持哦!
你们的鼓励是我坚持下去的动力!
!!!

力扣题库第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;
    }
}

作者:荷兰猪小灰灰
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

猜你喜欢

转载自blog.csdn.net/m0_48781656/article/details/122550217