633. 平方数之和-LeetCode(C++)

633. 平方数之和

2024.9.11

题目

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

  • 0 <= c <= 2的31次方 - 1
示例

示例 1:

复制代码
输入:c = 5
输出:true
解释:1 * 1 + 2 * 2 = 5

示例 2:

复制代码
输入:c = 3
输出:false
反思

1.不要想当然的认为这道题有一致的解法,虽然也可以用某种方式去做,但很可能有更简单的方式。

2.千万注意题目中给值的边界,如本题0 <= c <= 2的31次方 ,前后两个边界都要考虑,一个是ab均有可能为0,另一个是ab都有可能不能被int存放。

题解1-square

将数组nums的值和它对应的索引存入哈希表作为键值对,利用哈希表查询时间复杂度为O(1),查询nums[i]是否存在。

c++ 复制代码
class Solution {
public:
    bool judgeSquareSum(int c) {
        for (long a = 0; a * a <= c; ++a) {
            long b_squared = c - a * a;
            long b = std::sqrt(b_squared);
            if (b * b == b_squared) { // 如果 b 是整数,那么 b_squared 是完全平方数
                return true;
            }
        }
        return false;
    }
};
题解2-双指针

来自力扣官方题解

不失一般性,可以假设 a≤b。初始时 a=0,b=更号c ,进行如下操作:

c++ 复制代码
class Solution {
public:
    bool judgeSquareSum(int c) {
        long left = 0;
        long right = (int)sqrt(c);
        while (left <= right) {
            long sum = left * left + right * right;
            if (sum == c) {
                return true;
            } else if (sum > c) {
                right--;
            } else {
                left++;
            }
        }
        return false;
    }
};
相关推荐
芒克芒克15 小时前
数组去重进阶:一次遍历实现最多保留指定个数重复元素(O(n)时间+O(1)空间)
数据结构·算法
星火开发设计15 小时前
二维数组:矩阵存储与多维数组的内存布局
开发语言·c++·人工智能·算法·矩阵·函数·知识
夜勤月16 小时前
彻底终结内存泄漏与悬挂指针:深度实战 C++ 智能指针底层原理与自定义内存池,打造稳如泰山的系统基石
开发语言·c++
Fcy64816 小时前
⽤哈希表封装unordered_map和unordered_set(C++模拟实现)
数据结构·c++·散列表
CSDN_RTKLIB16 小时前
右值引用一个误区
c++
丨康有为丨16 小时前
算法时间复杂度和空间复杂度
算法
HarmonLTS16 小时前
Python人工智能深度开发:技术体系、核心实践与工程化落地
开发语言·人工智能·python·算法
a程序小傲16 小时前
京东Java面试被问:RPC调用的熔断降级和自适应限流
java·开发语言·算法·面试·职场和发展·rpc·边缘计算
一分之二~16 小时前
二叉树--层序遍历(迭代和递归)
数据结构·c++·算法·leetcode
zl_vslam17 小时前
SLAM中的非线性优-3D图优化之绝对位姿SE3约束右扰动(十七)
人工智能·算法·计算机视觉·3d