力扣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) 的时间.因此时间复杂度为 ...
随机推荐
- day01-项目介绍与环境搭建
项目介绍与环境搭建 1.项目学习前置知识 Java基础知识 javaweb MySQL SpringBoot SSM(Spring,SpringMVC,MyBatis) Maven 2.学习收获 了解 ...
- 使用ConnectivityManager.bindProcessToNetwork绑定特殊网络
最近测试那边提了一个bug,经过排查后发现其原因:是因为连接的Wi-Fi无法上网,因此在Android系统的多网络策略中,可以上网的SIM移动网络被设置为系统默认网络,投屏组件docker传输与反控模 ...
- 数与计算机 (编码、原码、反码、补码、移码、IEEE 754、定点数、浮点数)
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明 本文作为本人csdn blog的主站的备份.(Bl ...
- C#断字符串是否为数字,用正则表达式
- 在 SwiftUI 中使用 Metal Shader
简介 从 iOS 17/macOS 14 开始,SwiftUI 支持使用 Metal shader 来实现一些特效.主要提供三个 View Modifier:colorEffect. distorti ...
- 开发必会系列:《Java多线程编程实战》读书笔记
如何判断是否开启超线程 一 基础 进程是程序向操作系统申请资源(如内存空间和文件句柄)的基本单位.线程是进程中可独立执行的最小单位. 在Java平台中创建一个线程就是创建一个Thread类(或其子类 ...
- 使用maven命令安装Oracle的jar包到本地仓库
mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.2.0.4 -Dpackaging=jar ...
- swagger的使用及配置
引入坐标 <!--swagger--> <dependency> <groupId>io.springfox</groupId> <artifac ...
- FFmpeg开发笔记(十)Linux环境给FFmpeg集成vorbis和amr
FFmpeg内置了aac音频格式,在<FFmpeg开发实战:从零基础到短视频上线>一书的"5.2.2 Linux环境集成mp3lame"又介绍了如何给FFmpeg集 ...
- async/await 致WPF卡死问题
问题代码: xmal:一个按钮+一个显示框 1 <Button Width="100" Height="50" Margin="10" ...