力扣633(java&python)-平方数之和(中等)

题目:

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

 示例 1:

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

输入:c = 3
输出:false
 

提示:

0 <= c <= 231 - 1

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/sum-of-square-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

一、双指针

根据a2 + b2 = c,可以得出a和b的取值范围均为[0,sqrt(c)],故可以初始化两个指针a = 0, b = sqrt(c),则开始循环,循环条件是当 a <= b:

  • a+ b2 < c : 当前值比目标值要小,a++;
  • a2 + b2 > c:当前值比目标值要大,b--;
  • a2 + b2 = c:找到符合条件的 a 和 b,返回 true

循环结束没找到符合条件的值,则返回false。

例如:图解参考@嘉然

1.给定c = 32, 初始值a = 0, b = 5, 25 < 32,则a++;

 2.a = 1,b = 5,26 < 32,则a++;

 3.a = 2,b = 5, 29 < 32,则a++;

 4.a = 3,b = 5,34 > 32,则b--;

 5.a = 3,b = 4,25  < 32,则a++;

 6.a = 4,b = 4, 32与目标值相同,返回true

 根据图解的过程可以发现:

1.初始化时橙色格子一定在矩阵的右上角;

2.每次比较 a+ b2  和 c可以排除矩阵的一行或一列,即当前橙色格子的上方和右边的元素一定被排除了。

  • 小于 c :左边的元素都小于当前元素,只能下移,相当于a++。此时排除的是橙色格子以及左边同行的元素,都小于 c ,所以不会错过正确答案;
  • 大于 c :下面的元素都大于当前元素,只能左移,相当于b--。此时排除的是橙色格子以及下方同列的元素,都大于 c ,所以不会错过正确答案。

java代码:

注意:

long sum =(long) a * a + b * b;
如果不设为long 类型,a与b都是int类型,如果C为一个接近int极限值的值,b最大,在a++的过程中,sum算出来就可能超出int的最大值从而导致溢出。
 1 class Solution {
 2     public boolean judgeSquareSum(int c) {
 3         int a = 0,b = (int)Math.sqrt(c);
 4         while(a <= b){
 5             long sum =(long) a * a + b * b;
 6             if(sum < c){
 7                 a++;
 8             }else if(sum > c){
 9                 b--;
10             }else{
11                 return true;
12             }
13         }
14         return false;
15     }
16 }

python3代码:

 1 class Solution:
 2     def judgeSquareSum(self, c: int) -> bool:
 3         a, b = 0, (int)(math.sqrt(c))
 4         while a <= b:
 5             sum = a * a + b * b
 6             if(sum < c):
 7                 a += 1
 8             elif(sum > c):
 9                 b -= 1
10             else:
11                 return True
12         return False

 二、枚举

根据a2 + b2 = c,可以得出a和b的取值范围均为[0,sqrt(c)],那将a从[0,sqrt(c)],然后根据a算出b,然后对a * a + b * b == c进行判断,成立返回 true,不成立返回 fasle。

java代码:

 1 class Solution {
 2     public boolean judgeSquareSum(int c) {
 3         int max = (int)Math.sqrt(c);
 4         for(int a = 0; a <= max; a++){
 5             int b = (int)Math.sqrt(c - a * a);
 6             if(a * a + b * b == c) return true;          
 7         }
 8         return false;
 9     }
10 }

 python3代码:

1 class Solution:
2     def judgeSquareSum(self, c: int) -> bool:
3         max = (int)(math.sqrt(c))
4         for a in range(max + 1):
5             b = (int)(math.sqrt(c - a * a))
6             if  a * a + b * b == c:
7                 return True
8         return False

posted on 2022-09-26 17:56  我不想一直当菜鸟  阅读(29)  评论(0编辑  收藏  举报