leetcode---C++实现---633. Sum of Square Numbers(平方数之和)

题目

level: easy
Given a non-negative integer c, your task is to decide whether there’re two integers a and b such that a2 + b2 = c.

Example 1:

Input: 5
Output: True
Explanation: 1 * 1 + 2 * 2 = 5

Example 2:

Input: 3
Output: False

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sum-of-square-numbers

解题思路

借助双指针实现;由于是两数平方和==target,则单个数最大为sqrt(target),定义双指针的初始值时一个为0,另一个为sqrt(target)向下取整的整数;由于两数平方之和可能超出int表示范围,因此本题采用数据类型long记录中间数据;

  1. 声明两个变量,int l 代表从前到后遍历的数据,int r 代表从后往前遍历的数据;
  2. 当 l<=r 时,判断 l2 + r2 的值与target的大小。若 l2 + r2 > target,由于自然数单调递增的特性,只需将 r 减小1,则能将两数之和减少,可能达到等于target的要求; l2 + r2 < target,则需将 l 增加1,即可将两数之和增大,可能达到等于target的要求;若 l2 + r2 == target,则说明target可以找到两个整数且为这两数平方之和;
  3. 重复步骤2,若全部遍历完毕仍未找到 符合条件的 l 和 r,则说明target不满足为两数平方之和的条件。

算法实现(C++)

class Solution {
public:
    bool judgeSquareSum(int c) {
        long l = 0;
        long r = (long)sqrt(c);
        while (l <= r)
        {
            long sum = l*l + r*r;
            if (sum < c) ++l;
            else if (sum > c) --r;
            else return true;
        }
        return false;
    }
};
复杂度分析
  • 时间复杂度:O(sqrt(n)),对于给定的输入n,最多需要遍历sqrt(n)次;
  • 空间复杂度:O(1),只需定义两个双指针 l 和 r 即可。

你可能感兴趣的:(leetcode刷题笔记)