力扣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:
- a2 + 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.每次比较 a2 + 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)-平方数之和(中等)的更多相关文章
- 力扣(LeetCode)平方数之和 个人题解
给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c. 示例1: 输入: 5 输出: True 解释: 1 * 1 + 2 * 2 = 5 示例2: 输入: 3 ...
- 力扣 —— Two Sum ( 两数之和) python实现
题目描述: 中文: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利 ...
- Java实现 LeetCode 633 平方数之和(暴力大法)
633. 平方数之和 给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c. 示例1: 输入: 5 输出: True 解释: 1 * 1 + 2 * 2 = 5 ...
- C#版 - Leetcode 633. 平方数之和 - 题解
版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...
- C#刷遍Leetcode面试题系列连载(4) No.633 - 平方数之和
上篇文章中一道数学问题 - 自除数,今天我们接着分析 LeetCode 中的另一道数学题吧~ 今天要给大家分析的面试题是 LeetCode 上第 633 号问题, Leetcode 633 - 平方数 ...
- [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 ...
- [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 ...
- 【JavaScript】Leetcode每日一题-平方数之和
[JavaScript]Leetcode每日一题-平方数之和 [题目描述] 给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c . 示例1: 输入:c = 5 ...
- leetcode.双指针.633平方数之和-Java
1. 具体题目 给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a^2 + b^2 = c. 示例1: 输入: 5 输出: True 解释: 1 * 1 + 2 * 2 = 5 注 ...
- [Java]1.两数之和 - LeetCode
1 题目 2 思路与代码 思路一:暴力法(两层For循环) 时间复杂度:O(n^2) 对于每个元素,我们试图通过遍历数组的其余部分来寻找它所对应的目标元素,这将耗费 O(n) 的时间.因此时间复杂度为 ...
随机推荐
- 基于Apollo3 Blue MCU芯片的可穿戴产品解决方案开发之六轴加速度传感器适配
一 前记 MPU-60X0 是全球首例9 轴运动处理传感器.它集成了3 轴MEMS 陀螺仪,3 轴MEMS加速度计,以及一个可扩展的数字运动处理器DMP(Digital Motion Processo ...
- day01-项目介绍+SSM环境搭建
项目介绍+SSM环境搭建 1.项目功能/界面 SSM整合项目界面:使用Vue完成 技术栈:前后端分离开发,前端框架Vue3+后端框架SSM 前端框架-Vue3 后端框架-SSM(SpringMVC+S ...
- 解锁通达信金融终端Level-2功能
外挂方式,不修改原程序. 逆向通达信Level-2 续十一 (无帐号登陆itrend研究版) 逆向通达信Level-2 续十 (trace脱壳) 逆向通达信Level-2 续九 (无帐号打开itren ...
- openssl 版本兼容问题 备忘录
第三方依赖openssl,但openssl却有版本不同符号不兼容的问题,由于条件限制不得不使用固定版本的openssl,又或者同时有两个第三方依赖不同版本的openssl,只能靠手动,为了备忘. 1. ...
- 无力吐槽,uniapp项目外包接单碰上了这样的开发人员
随着疫情期形式的不断变化,线上线下各个行业都受到冲击.2020年我在家歇息了近4个月:跟很多人一样这一年我失业了,那段时间真的很迷茫,年龄也已过30,加上网上各种"开发人员35岁" ...
- 恶意软件开发(四)通过查找进程名进行DLL注入
通过进程名查找PID 当我们编写注入器的时候,肯定是希望直接通过进程名进行注入,而不是像上一篇笔记一样通过手动输入PID进行查找. 通过进程名查找PID的步骤如下: (1)创建系统中所有进程的快照 ( ...
- KingbaseES生成动态SQL
1. 动态SQL 动态SQL在程序启动时会根据输入参数替换相应变量.使用动态SQL可以创建更强大和灵活的应用程序,但在编译时SQL语句的全文不确定,因此运行时编译会牺牲一些性能.动态SQL可以是代码或 ...
- LeetCode 416. 分割等和子集(bitset优化)
LeetCode 416. 分割等和子集 1 题目描述 给你一个只包含正整数的非空数组nums.请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等. 1.1 输入测试 示例 1: 输入 ...
- 7 JavaScript循环语句
7 循环语句 在js中有三种循环语句. 首先是while循环. 它的逻辑和咱们python中的while几乎一模一样, 就是符号上有些许的区别. // 语法 while(条件){ 循环体 -> ...
- #贪心#洛谷 3173 [HAOI2009]巧克力
题目 分析 既然每一刀都要切,那肯定代价越大的要越早切, 考虑按代价降序排序,如果切了一行,求切列的时候贡献的行数就多了1. 代码 #include <cstdio> #include & ...