【Python3】【力扣题】367. 有效的完全平方数

【力扣题】题目描述:

【Python3】代码:

1、解题思路:Python函数。num的平方根 或者 num的0.5次幂。

知识点:float.is_integer(...):判断浮点数的值是否等于整数。也可以:浮点数.is_integer()。

              pow(a,b):即 a^{b},内置函数。

              math.pow(a,b):即 a^{b} 。

             operator.pow(a,b):即 a^{b}

             math.sqrt(num):num的平方根,即\sqrt{num}

补充:pow(a,b):指数为浮点数,则结果为浮点数;指数为整数,则结果为整数。且结果是近似值。

math.pow(a,b):结果都是浮点数,且结果是精确浮点数。

operator.pow(a,b):与内置运算符对应的高效率函数。结果同pow(a,b)一致。

class Solution:def isPerfectSquare(self, num: int) -> bool:return float.is_integer(pow(num,0.5))# 或者import mathreturn float.is_integer(math.pow(num,0.5))# 或者import operatorreturn float.is_integer(operator.pow(num,0.5))# 或者import mathreturn math.sqrt(num).is_integer()

2、解题思路:从1开始,依次判断其平方是否等于num。若其平方大于num,则不满足。

class Solution:def isPerfectSquare(self, num: int) -> bool:i = 1square = 1while square <= num:if square == num:return Truei += 1square = i * ireturn False# 或者i = 1while i * i < num:i += 1return i * i == num

3、解题思路:二分查找。取1到num的中间值,若中间值的平方等于num,返回True。若中间值的平方小于num,则中间值开始的后半部分作为查找区间;若中间值的平方大于num,则从中间值的前半部分作为查找区间;再次取查找区间的中间值,比较其平方是否等于num。

class Solution:def isPerfectSquare(self, num: int) -> bool:left, right = 0, numwhile left <= right:mid = left + (right-left) // 2square = mid * midif square < num:left =  mid + 1elif square > num:right =  mid - 1elif square == num:return Truereturn False

4、解题思路:牛顿迭代法。

牛顿迭代法:一种在实数域和复数域上近似求解方程的方法。其本质是借助泰勒级数,从初始值开始快速向函数零点逼近,即 使用函数f(x)的泰勒级数的前面几项来寻找方程f(x)=0的根。广泛用于计算机编程。需注意:确定迭代值,迭代关系式,结束迭代的条件。

泰勒级数:无限项连加式(级数)来表示一个函数,这些相加的项由函数在某一点的导数求得。在近似计算中有重要作用。

导数:函数的局部性质。函数在某一点的导数描述了该函数在这一点附近的变化率。若函数的自变量和取值都是实数,函数在某一点的导数就是函数曲线上这一点的切线斜率。

斜率:一条直线(或曲线的切线)对于(横)坐标轴倾斜程度的量。若直线垂直于x轴,斜率不存在或称斜率无穷大;若直线平行于x轴,斜率为0;其余,直线y=kx+b,则斜率k=tan\alpha =\frac{y1-y2}{x1-x2}=\frac{y2-y1}{x2-x1}

求导:微积分的基础。对函数求导,用f'\left ( x \right )表示。可导的函数一定连续,连续的函数不一定可导。

详解:① 若num是完全平方数,则x^{2}=num,因此 方程 y=f(x)=x^{2}-num初始迭代值为x_{0},则 y_{0}=x_{0}^{2}-num

② 对f(x)求导(导数公式:{\left (x^{n} \right )}'=nx^{n-1}{\left ( C \right )}'=0其中C为常数):f'(x)=2x。

③ 过当前迭代值(x_{i},y_{i})做一条斜率为该点导数的直线。即斜率 k=2x_{i}=\frac{y-y_{_{i}}}{x-x_{i}} ,该直线为 y=2x_{i}x-x_{i}^{2}-num

④ 该直线与横轴的交点为 (\frac{x_{i}^{2}+num}{2x_{i}},0),横坐标为x_{i+1}=\frac{1}{2}\left ( x_{i}+\frac{num}{x_{i}} \right )即下一个迭代值,根据方程计算出 y_{i+1}=x_{i+1}^{2}-num

⑤ 重复③ ④ 依次迭代下去,若两次迭代值之间的差值小于极小的非负数\epsilon(一般10^{-6}或者10^{-7}),则近似的获得结果。

注解:近似求解。初始迭代值为num,迭代关系式为(x0+num/x0)/2,终止迭代条件为x0-x1<1e-6。

class Solution:def isPerfectSquare(self, num: int) -> bool:x0 = numwhile True:x1 = (x0 + num / x0) / 2if x0 - x1 < 1e-6:breakx0 = x1x0 = int(x0)return x0 * x0 == num

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

排序算法:n个0~1000之间的整数,将他们从大到小排序

上榜理由&#xff1a; 如果没见过这种排序题&#xff0c;可能首先想到的就是常用的排序算法&#xff0c;比如快速排序&#xff0c;归并排序&#xff0c;那如果输入的n足够大&#xff0c;时间复杂度肯定比较高。其实题目0-1000的范围是一个题眼&#xff0c;所以一定有更优的排序…

PAT-10道题

PAT算法刷题 1002 1002 一&#xff1a;对于每一的1到6都进行枚举&#xff0c;进行递归操作 二&#xff1a;如果位数到了指定的n的时候&#xff0c;递归的条件&#xff0c;进行判断是否可以整除操作 #include<iostream> #include<algorithm> using namespace std; l…

没有预装Edge浏览器的Windows系统安装Edge正式版的方法,离线安装和在线安装

一、在线安装 没有预装Edge浏览器的Windows系统安装Edge正式版的方法 二、离线安装 进入到下面这个目录 C:\Program Files (x86)

vue3+ts 全局函数和变量的使用

<template><div>{{ $env }}<br />{{ $filters.format("的飞机") }}</div> </template><script setup lang"ts"> import { getCurrentInstance } from "vue"; const app getCurrentInstance(); console.log…

SELinux(一) 简介

首发公号&#xff1a;Rand_cs 前段时间的工作遇到了一些关于 SELinux 的问题&#xff0c;初次接触不熟悉此概念&#xff0c;导致当时配置策略时束手束脚&#xff0c;焦头烂额&#xff0c;为此去系统的学习了下 SELinux 的东西。聊 SELinux 之前&#xff0c;先来看看什么叫做访…

UE5学习(游戏存档,两种适应性的射线检测,时间膨胀)

游戏存档 0.建立游戏存档类 1.建立存档 命名要用规律&#xff0c;读档时根据命名调用 2.读取存档 这里是用存档时间&#xff08;秒&#xff09;验证是否有存档成功。 两种鼠标位置射线检测方法 两种适用性未使用大量项目验证&#xff0c;为个人观点 1.适用于游戏中 2.适用于…

Python实现视频人脸检测识别功能

目录 一、引言 二、人脸检测识别技术概述 三、Python实现视频人脸检测识别功能的步骤 1、安装相关库和工具 2、加载视频文件 3、人脸检测和识别 4、保存视频结果 四、实验结果和讨论 五、结论 一、引言 在当今社会&#xff0c;人脸检测识别技术在安全监控、人机交互、…

Databend 开源周报第 121 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 支持追加流 Da…

灰度发布专题---2、Dubbo灰度发布

通过上面描述&#xff0c;我们理解了什么是灰度发布&#xff0c;接下来我们基于Dubbo实现灰度发布。Dubbo的灰度发布常见的方式有版本控制灰度发布、路由灰度发布、基于Apollo实现灰度发布&#xff0c;我们把这每种灰度发布都实现一次。 在学习Dubbo灰度发布之前&#xff0c;我…

Linux僵死进程及文件操作

1.僵死进程(僵尸进程)&#xff1a; 1.僵死进程产生的原因或者条件: 什么是僵死进程? 当子进程先于父进程结束,父进程没有获取子进程的退出码,此时子进程变成僵死进程. 简而言之,就是子进程先结束,并且父进程没有获取它的退出码; 那么僵死进程产生的原因或者条件就是:子进…

第13关 解决K8s中Ingress Nginx控制器无法获取真实客户端IP的问题

------> 课程视频同步分享在今日头条和B站 大家好&#xff0c;我是博哥爱运维。 这节课带大家探索并分享最全面的解决在使用Kubernetes&#xff08;K8s&#xff09;和Ingress-Nginx-Controller中无法获取客户端真实IP问题的视频教程&#xff0c;帮助你快速理解并解决这一问…

vue select选择下拉组织树,解决不出现横向滚动条

背景&#xff1a;由于项目需求需要使用下拉选择框的组织架构树 实现代码如下&#xff1a; <el-row><el-col :span"18"><el-form-item label"所属组织:" prop"groupName"><el-select v-model"dataForm.groupName"…