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

示例 1:

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

输入:c = 3
输出:false
示例 3:

输入:c = 4
输出:true
示例 4:

输入:c = 2
输出:true
示例 5:

输入:c = 1
输出:true

提示:

0 <= c <= 231 - 1

解题思路

维护l,r两个元素值,l=0,r=sqrt©,满足了l<=r条件,当ll+rr小于目标值,就需要移动左指针。当ll+rr大于目标值,说明元素太大了,就需要移动右指针。

原理

相当于每次固定一个右边界,然后收缩左边界。
为什么每次左指针不从1开始遍历,而是从上次的左指针开始?
因为每次更换右边界的条件是ll+rr>c, 这证明当前两个左指针的平方和太大了,所以需要换一个更小的右指针。那左指针前面的值为什么不行呢?

例如l-1,因为l是由l-1转移来的,而l-1转移到l的条件是l*l+r-r<c(注意:这里的r是缩减边界前的r)),在r更大的情况下,l-1产生的平方和都是偏小了,而现在又边界还收缩了,产生的平方和就更小了,所以根本不需要从1重新遍历一次,直接从左指针开始就可以了。

代码

func judgeSquareSum(c int) bool {l,r:=0,int(math.Sqrt(float64(c)))for l<=r {cur:=l*l+r*rif cur==c{return true}else if cur<c{l++}else {r--}}return false}

复杂度分析

时间复杂度:O(sqrt©)。最坏情况下 l 和 r 一共枚举了 0 到 sqrt©
里的所有整数。

空间复杂度:O(1)。

leetcode 633. 平方数之和(双指针)相关推荐

  1. LeetCode 633 平方数之和

    题目描述 给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c . 题解 和两数之和那道题目的求解方式类似,需要注意整数的溢出. 代码 class Solutio ...

  2. 2022-4-16 Leetcode 633.平方数之和

    第一版,使用双指针,但是造成了溢出. class Solution {public:bool judgeSquareSum(int c) {vector<int> arr(c+1);for ...

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

    点击蓝字"dotNET匠人"关注我哟 加个"星标★",每日 7:15,好文必达! 前文传送门: 上篇文章中一道数学问题 - 自除数,今天我们接着分析 LeetC ...

  4. leetcode题解15-三数之和(双指针经典)

    问题描述 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组. 注意:答案中不可以包 ...

  5. 167. 两数之和 II - 输入有序数组633. 平方数之和

    167. 给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列  ,请你从数组中找出满足相加之和等于目标数 target 的两个数.如果设这两个数分别是 numbers[i ...

  6. Leetcode 15.三数之和 双指针 or 暴力哈希

    题目链接:传送门 题目:给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组. 暴力+ ...

  7. 633.平方数之和(Sum of Square Numbers)

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

  8. [双指针|模拟] leetcode 15 三数之和

    [双指针|模拟] leetcode 15 三数之和 1.题目 题目链接 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ? ...

  9. LeetCode 15三数之和16最接近的三数之和

    三数之和(双指针) 题意: 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组. 注意 ...

最新文章

  1. 【Live555】live555源码详解(九):ServerMediaSession、ServerMediaSubsession、live555MediaServer
  2. [Ms SQL] 基本創建、修改與刪除
  3. 为什么没有MMU的处理器无法安装操作系统?
  4. GIT项目管理工具(part1)--简介及概念
  5. 电脑功耗测试软件_电脑“烤机”怎么测?用这几款软件就对了
  6. php shell ddos,用shell解决ddos攻击实例
  7. 两步解决:PDF旋转后怎么保存?
  8. BTA | CSDN蒋涛:区块链时代最大赢家,将属于技术、经济、组织的三合一高手
  9. 【预测模型】人口结构可持续发展模型构建
  10. 网页游戏外挂的设计与编写:QQ摩天大楼【二】(登陆准备-信息处理方式)
  11. 游戏服务端(MMORPG)的基础算法一、AOI
  12. 【高效获取jpeg图片的尺寸】
  13. 关于使用LocationManager时遇到的问题
  14. 支持中文的deepdive:斯坦福大学的开源知识抽取工具(三元组抽取)
  15. 节点偏差Junction Deviation
  16. 分析谷歌收购摩托罗拉无线对移动产业带来的影响
  17. Sharding-JDBC简单使用
  18. 性能监控-软中断出现瓶颈的查看方式
  19. 分享给爱看电影的朋友们一款应用,磁力网盘app~~
  20. Spring Boot Admin (Spring Clould Admin) 官方文档重点内容中文翻译

热门文章

  1. 【FPGA Verilog】实验二:key按键基础实验
  2. 【Leetcode | 11】268. 缺失数字
  3. 从零开始系统化学Android,值得收藏!
  4. 牛客网笔记之JAVA运算符
  5. 套接字设置为(非)阻塞模式
  6. 深挖“窄带高清”的实现原理
  7. http://nancyfx.org + ASPNETCORE
  8. JavaScript DOM编程艺术第二版学习(1/4)
  9. XML解析之JAXP案例详解
  10. HDU 2289 几何+圆台