【算法学习】平方数之和

news2024/9/18 10:37:02

title: 【力扣】633.平方数之和
cover: ‘https://storage.bummon.com/image/202308171051399.png’
tags:

  • 算法
  • LeetCode
  • 双指针法
  • 二分查找法
    categories:
  • 算法笔记
    abbrlink: 2911343079
    date: 2023-08-17 10:49:52
    mathjax: true

【力扣】633.平方数之和

题目

原题链接

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

示例 1:

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

示例 2:

输入: c = 3
输出: false

提示:

  • 0≤ c ≤ 231-1

双指针法

思路分析

由题意得,我们可以定义两个变量 ab ,使 a * a + b * b = c ,且又可以看到题目中提示了 0≤c ≤231-1 ,那么我们假设a=0,那么b= c \sqrt{c} c ,此时 a为最小值,b为最大值,那么我们可以得出:

  • 当 a^2 + b^2 == c 时,我们得到了想要的结果
  • 当 a^2 + b^2 > c 时,我们需要让 a 大一些,也就是 a+1
  • 当 a^2 + b^2 < c 时,我们需要让b小一些,也就是 b-1

通过下图来理解。

图解

G-_DownLoad_a.gif

代码实现

public boolean judgeSquareSum(int c) {
    if (c < 0) {
        return false;
    }
    long start = 0;
    long end = (long) Math.sqrt(c);
    while (start <= end) {
        long sum = start * start + end * end;
        if (sum == c) {
            return true;
        } else if (sum > c) {
            end--;
        } else {
            start++;
        }
    }
    return false;
}

sqrt函数法

思路分析

我们还可以使用Java中的 Math.sqrt() 函数来实现,sqrt 函数是一个取根号,我们可以用传入的 c 来减去 a^2,结果设为 b^2 ,最后通过 sqrt 函数来取出 b ,最终我们通过强转 int 来使其变成整数,并判断 强转前的 b强转后的 b 进行对比,如果相等说明取出的 b 为整数,如果不相等那就说明 不是整数,那就继续循环。

代码实现

public boolean judgeSquareSum(int c) {
    for (long a = 0; a * a <=c; a++) {
        double b = Math.sqrt(c - a * a);
        if (b == (int) b) {
            return true;
        }
    }
    return false;
}

总结

在该题目中我们使用了两种写法:双指针法sqrt函数法

双指针法 中,数组最多遍历到 c \sqrt{c} c ,则时间复杂度为 O ( c ) O(\sqrt{c}) O(c ),空间复杂度为 O(1)。

sqrt函数法 中,我们最大判定条件为 a * a ≤ c ,那么时间复杂度为 O( c \sqrt{c} c ),空间复杂度为O(1)。


推荐

关注博客和公众号获取最新文章

Bummon’s Blog | Bummon’s Home | 公众号

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/898187.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue 2 计算属性与侦听器

计算属性 vs 方法 vs 侦听器 计算属性的出现是为了解决模板内表达式太过复杂而变得难以维护。 假设我们知道长和宽&#xff0c;要计算一个矩形的面积&#xff0c;如果没有计算属性&#xff0c;我们可能像下面这样处理&#xff1a; <div id"app"><input t…

functools.wrap的使用

一、介绍 functools.wraps 是 Python 标准库中的一个函数&#xff0c;用于帮助创建装饰器时保留被装饰函数的元数据&#xff08;如函数名、文档字符串等&#xff09;。在使用装饰器时&#xff0c;如果不使用 functools.wraps&#xff0c;则被装饰函数的一些元数据可能会丢失或…

ubuntu系统快捷键

前言&#xff1a;可以在设置—>设备—>键盘中查看键盘快捷键 打开活动搜索界面 Super键 想要打开一个应用程序&#xff1f;按下 Super 键然后搜索应用程序。如果搜索的应用程序未安装&#xff0c;它会推荐来自应用中心的应用程序。 想要看看有哪些正在运行的程序&#xf…

【C++笔记】C++之类与对象(中)

【C笔记】C之类与对象&#xff08;中&#xff09; 1、类的构造函数1.1、构造函数的基本用法1.2、构造函数的7个特性 2、类的析构函数2.1、析构函数的基本用法2.2、析构函数的6个特性 3、类的拷贝构造函数3.1、拷贝构造的基本用法3.2、拷贝构造的“无限套娃”陷阱3.3、深拷贝与浅…

汽车领域专业术语

1. DMS/OMS/RMS/IMS DMS&#xff1a;即Driver Monitoring System&#xff0c;监测对象为Driver&#xff08;驾驶员&#xff09;。DMS三大核心&#xff1a; OMS&#xff1a;即Occupancy Monitoring System&#xff0c;监测对象为乘客。 RMS&#xff1a;后排盲区检测系统 IMS&…

动手学深度学习--基础知识上篇

&#x1f388;动手学deep learning ☁️本专栏会定期更新关于动手学深度学习的每章知识点的讲解&#xff0c;题目答案 &#x1f47b;如果喜欢&#xff0c;欢迎点赞&#xff0c;收藏 动手学深度学习-预备知识篇 线性代数篇 1-3题讲解 证明一个矩阵 A \mathbf{A} A的转置的转置…

C#程序配置读写例子 - 开源研究系列文章

今天讲讲关于C#的配置文件读写的例子。 对于应用程序的配置文件&#xff0c;以前都是用的ini文件进行读写的&#xff0c;这个与现在的json类似&#xff0c;都是键值对应的&#xff0c;这次介绍的是基于XML的序列化和反序列化的读写例子。对于ini文件&#xff0c;操作系统已经提…

Java课题笔记~ 整合第三方技术

1. 整合JUnit 问题导入 回忆一下Spring整合JUnit的步骤&#xff1f; 1.1 Spring整合JUnit&#xff08;复习&#xff09; 1.2 SpringBoot整合JUnit 【第一步】添加整合junit起步依赖(可以直接勾选) <dependency><groupId>org.springframework.boot</groupId…

什么是变量提升(hoisting)?它在JavaScript中是如何工作的?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 变量提升&#xff08;Hoisting&#xff09;⭐ 变量提升的示例&#xff1a;⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&…

水果成篮(力扣)双指针滑动窗口 JAVA

你正在探访一家农场&#xff0c;农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示&#xff0c;其中 fruits[i] 是第 i 棵树上的水果 种类 。 你想要尽可能多地收集水果。然而&#xff0c;农场的主人设定了一些严格的规矩&#xff0c;你必须按照要求采摘水果&…

[管理与领导-27]:IT基层管理者 - 团队管理 - 育人 - 如何评估团队的能力?如何培养团队?

目录 一. 培养团队&#xff08;练兵&#xff09;为什么很重要 二. 如何评估团队的能力模型 三、培养人才 一. 培养团队&#xff08;练兵&#xff09;为什么很重要 培养团队是组织中的一项重要任务&#xff0c;以下是一些说明为什么培养团队是如此重要的原因&#xff1a; 养…

MAC QT开发攻略

文章目录 基础步骤安装QT、QTCreator安装CMakeNinja 安装Clion编译器在QTCreator中新建项目更改CMake生成器 导入Clion CMake生成文件 基础步骤 安装QT、QTCreator 安装CMake 由于clion需要使用cmake构建 Ninja Ninja下载 安装Clion编译器 Clion 2023.1.3 破解版安装教程…

从零注册和搭建搭建uniapp微信小程序项目

03 - 开发环境搭建和项目创建 语雀 目标 什么是小程序拥有小程序开发者账号安装微信开发者工具创建小程序项目使用基本的组件上线一个体验版小程序 什么是小程序 了解小程序&#xff0c;以及小程序开发为什么会成为一门单独的职业。 我们从以下3个视角&#xff0c;来了解一下…

手把手教学——终端工具xshell与文件传输工具xftp使用步骤及详解

前言 xshell是一款常用于连接本地linux服务以及云服务器的终端远程连接工具&#xff0c;该款终端工具常搭配远程文件传输工具xftp一起使用&#xff0c;由于还有很多小伙伴还不知道这两款终端工具的使用流程及步骤&#xff0c;Darren洋在这里给小伙伴们进行详细讲解。 一、下载工…

【Java】对象数组排序(Comparable接口/Comparator接口)

Comparable接口&#xff08;compareTo&#xff09; Arrays 类中的 sort 方法承诺可以对对象数组进行排序&#xff0c;但要求满足下列前提&#xff1a;对象所属的类必须实现了 Comparable 接口&#xff0c;且定义了compareTo方法。 Comparable接口的代码 public interface Comp…

无涯教程-TensorFlow - 单词嵌入

Word embedding是从离散对象(如单词)映射到向量和实数的概念&#xff0c;可将离散的输入对象有效地转换为有用的向量。 Word embedding的输入如下所示: blue: (0.01359, 0.00075997, 0.24608, ..., -0.2524, 1.0048, 0.06259) blues: (0.01396, 0.11887, -0.48963, ..., 0.03…

解决Pycharm的Settings中Project不见了也无法选择Python Interpreter的方法

目录 一、问题如下二、解决方法 一、问题如下 突然打开项目没有python解释器&#xff0c;也无法重新配置python Interpreter&#xff0c;而且整个文件夹是黄色高亮的形式&#xff0c;如下显示&#xff0c;而且重新安装了pycharm也没用甚至说打开File–>Setting–>Projec…

网络编程套接字(1)

文章目录 网络编程套接字(1)1. 预备知识1.1 源IP与目的IP1.2 认识端口号1.3 理解 "端口号" 和 "进程ID"1.4 源端口号和目的端口号1.5 认识TCP协议和UDP协议(1) TCP(2) UDP 1.6 网络字节序 2. socket编程接口2.1 socket 常见API2.2 sockaddr结构 网络编程套…

深度学习环境搭建 cuda、模型量化bitsandbytes安装教程 windows、linux

cuda、cudann、conda安装教程 输入以下命令&#xff0c;查看 GPU 支持的最高 CUDA 版本。 nvidia-smi cuda安装&#xff08;cudatoolkit&#xff09; 前往 Nvidia 的 CUDA 官网&#xff1a;CUDA Toolkit Archive | NVIDIA Developer CUDA Toolkit 11.8 Downloads | NVIDIA …

react之路由的安装与使用

一、路由安装 路由官网2021.11月初&#xff0c;react-router 更新到 v6 版本。使用最广泛的 v5 版本的使用 npm i react-router-dom5.3.0二、路由使用 2.1 路由的简单使用 第一步 在根目录下 创建 views 文件夹 ,用于放置路由页面 films.js示例代码 export default functio…