题目:

给定一个非负整数 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

力扣633(java&python)-平方数之和(中等)的更多相关文章

  1. 力扣(LeetCode)平方数之和 个人题解

    给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c. 示例1: 输入: 5 输出: True 解释: 1 * 1 + 2 * 2 = 5 示例2: 输入: 3 ...

  2. 力扣 —— Two Sum ( 两数之和) python实现

    题目描述: 中文: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利 ...

  3. Java实现 LeetCode 633 平方数之和(暴力大法)

    633. 平方数之和 给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c. 示例1: 输入: 5 输出: True 解释: 1 * 1 + 2 * 2 = 5 ...

  4. C#版 - Leetcode 633. 平方数之和 - 题解

    版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...

  5. C#刷遍Leetcode面试题系列连载(4) No.633 - 平方数之和

    上篇文章中一道数学问题 - 自除数,今天我们接着分析 LeetCode 中的另一道数学题吧~ 今天要给大家分析的面试题是 LeetCode 上第 633 号问题, Leetcode 633 - 平方数 ...

  6. [LeetCode] 633. Sum of Square Numbers 平方数之和

    Given a non-negative integer c, your task is to decide whether there're two integers a and b such th ...

  7. [LeetCode] Sum of Square Numbers 平方数之和

    Given a non-negative integer c, your task is to decide whether there're two integers a and b such th ...

  8. 【JavaScript】Leetcode每日一题-平方数之和

    [JavaScript]Leetcode每日一题-平方数之和 [题目描述] 给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c . 示例1: 输入:c = 5 ...

  9. leetcode.双指针.633平方数之和-Java

    1. 具体题目 给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a^2 + b^2 = c. 示例1: 输入: 5 输出: True 解释: 1 * 1 + 2 * 2 = 5 注 ...

  10. [Java]1.两数之和 - LeetCode

    1 题目 2 思路与代码 思路一:暴力法(两层For循环) 时间复杂度:O(n^2) 对于每个元素,我们试图通过遍历数组的其余部分来寻找它所对应的目标元素,这将耗费 O(n) 的时间.因此时间复杂度为 ...

随机推荐

  1. C++字符串编码转换

    C++中字符串有很多种类,详情参考C++中的字符串类型.本文主要以string类型为例,讲一下字符串的编码,选择string主要是因为: byte是字符串二进制编码的最小结构,字符串本质上就是一个by ...

  2. 什么是k8s中的sidecar模式

    在Kubernetes中,Sidecar模式是一种将辅助容器与主应用程序容器一起部署在同一个Pod中的设计模式.这种模式的目的是将辅助功能与主应用程序解耦,并提供独立发布.能力重用以及共享资源和网络的 ...

  3. Docker部署nginx配置SSL多目录

    对自己第一次搭建nginx做个简要的笔记 第一步:创建宿主机挂载点目录 mkdir -p /home/nginx/{conf,conf.d,html,log,ssl} 第二步:安装简易版nginx,复 ...

  4. 文件的特殊权限:SUID,SGID,SBIT

    文件的特殊权限:SUID,SGID,SBIT Set UID SUID权限只用于二进制文件 运行者必须有X权限 运行者在程序运行过程(run-time)中具有二进制文件拥有者(owner)的权限 例子 ...

  5. Linux安装jdk和mysql

    Linux安装jdk和mysql JDK安装 操作步骤: 使用FinalShell自带的上传工具将jdk的二进制发布包上传到Linux空jdk-8u171-inux-x64.tar.gz(这里注意自己 ...

  6. 记录--一个炫酷的css动画

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 最近有一个需求,要我实现一个动画效果,效果如下 简单分析了一下效果,是一个3d的效果,首先是一个圆,接着是两段圆环,第三层是一堆小圆环,最 ...

  7. 记录--7 个沙雕又带有陷阱的 JS 面试题

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 为了保证的可读性,本文采用意译而非直译. 在 JS 面试中,经常会看到一些简单而又沙雕的题目,这些题目包含一些陷阱,但这些在我们规范的编码 ...

  8. ResNet-RS:谷歌领衔调优ResNet,性能全面超越EfficientNet系列 | 2021 arxiv

    论文重新审视了ResNet的结构.训练方法以及缩放策略,提出了性能全面超越EfficientNet的ResNet-RS系列.从实验效果来看性能提升挺高的,值得参考   来源:晓飞的算法工程笔记 公众号 ...

  9. debian12 出现Waiting for suspend/resume device ... Begin: Running /scripts/local-block ... done.

    /etc/initramfs-tools/conf.d/resume里对应的交换分区的uuid不正确 删除/etc/initramfs-tools/conf.d/resume 再运行 sudo upd ...

  10. 【已解决】IDEA项目启动时Maven报错:Downgrade Maven to version 3.8.1 or earlier in settings

    报错场景如下: Possible solutions: Check that Maven pom files not contain http repository http://mvn.gt.ige ...