Skip to content

Files

Latest commit

c29b144 · May 17, 2024

History

History
This branch is 1 commit ahead of, 1201 commits behind doocs/leetcode:main.

0633.Sum of Square Numbers

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
Apr 28, 2021
May 17, 2024
May 17, 2024
Mar 23, 2024
Jun 15, 2023
Jan 13, 2024
Jan 13, 2024
Mar 23, 2024
Mar 23, 2024
comments difficulty edit_url tags
true
中等
数学
双指针
二分查找

English Version

题目描述

给定一个非负整数 c ,你要判断是否存在两个整数 ab,使得 a2 + b2 = c

 

示例 1:

输入:c = 5
输出:true
解释:1 * 1 + 2 * 2 = 5

示例 2:

输入:c = 3
输出:false

 

提示:

  • 0 <= c <= 231 - 1

解法

方法一:数学 + 双指针

我们可以使用双指针的方法来解决这个问题,定义两个指针 a b ,分别指向 0 c 。在每一步中,我们会计算 s = a 2 + b 2 的值,然后比较 s c 的大小。如果 s = c ,我们就找到了两个整数 a b ,使得 a 2 + b 2 = c 。如果 s < c ,我们将 a 的值增加 1 ,如果 s > c ,我们将 b 的值减小 1 。我们不断进行这个过程直到找到答案,或者 a 的值大于 b 的值,返回 false

时间复杂度 O ( c ) ,其中 c 是给定的非负整数。空间复杂度 O ( 1 )

Python3

class Solution:
    def judgeSquareSum(self, c: int) -> bool:
        a, b = 0, int(sqrt(c))
        while a <= b:
            s = a**2 + b**2
            if s == c:
                return True
            if s < c:
                a += 1
            else:
                b -= 1
        return False

Java

class Solution {
    public boolean judgeSquareSum(int c) {
        long a = 0, b = (long) Math.sqrt(c);
        while (a <= b) {
            long s = a * a + b * b;
            if (s == c) {
                return true;
            }
            if (s < c) {
                ++a;
            } else {
                --b;
            }
        }
        return false;
    }
}

C++

class Solution {
public:
    bool judgeSquareSum(int c) {
        long long a = 0, b = sqrt(c);
        while (a <= b) {
            long long s = a * a + b * b;
            if (s == c) {
                return true;
            }
            if (s < c) {
                ++a;
            } else {
                --b;
            }
        }
        return false;
    }
};

Go

func judgeSquareSum(c int) bool {
	a, b := 0, int(math.Sqrt(float64(c)))
	for a <= b {
		s := a*a + b*b
		if s == c {
			return true
		}
		if s < c {
			a++
		} else {
			b--
		}
	}
	return false
}

TypeScript

function judgeSquareSum(c: number): boolean {
    let [a, b] = [0, Math.floor(Math.sqrt(c))];
    while (a <= b) {
        const s = a * a + b * b;
        if (s === c) {
            return true;
        }
        if (s < c) {
            ++a;
        } else {
            --b;
        }
    }
    return false;
}

Rust

use std::cmp::Ordering;

impl Solution {
    pub fn judge_square_sum(c: i32) -> bool {
        let mut a: i64 = 0;
        let mut b: i64 = (c as f64).sqrt() as i64;
        while a <= b {
            let s = a * a + b * b;
            match s.cmp(&(c as i64)) {
                Ordering::Equal => {
                    return true;
                }
                Ordering::Less => {
                    a += 1;
                }
                Ordering::Greater => {
                    b -= 1;
                }
            }
        }
        false
    }
}