搜索
首页后端开发Python教程N 的第 K 个因子 - O(sqrt n) 算法

介绍

最近我写了一篇文章《学习大O符号》一劳永逸。在那篇文章中,我回顾了 Big-O 备忘单中提供的所有类型的 Big O 时间表示法。我认为除了这七个时间符号之外,不可能有更多的时间符号。

仿佛宇宙本身在羞辱我、嘲笑我的无知,我遇到了一道 LeetCode 问题,其解法需要 O(√n) 时间。 如果你疯了,这可以翻译成 O(N^1/2)

问题

给你两个正整数 n 和 k。整数 n 的因子被定义为整数 i,其中 n % i == 0。

考虑按升序排列的 n 的所有因子的列表,返回此列表中的第 k 个因子,如果 n 少于 k 个因子,则返回 -1。

显而易见的解决方案

好吧,如果你像我一样,你的第一个想法就是遍历从 1 到 n 的每个数字,检查它是否是一个因子,如果它在所需的 k 索引中,则返回它。

代码如下所示:

def getkthFactorOfN(n, k):
    result = 0
    for i in range(1, n + 1):
        if n % i == 0:
            result = result + 1
            if result == k:
                return i
    return -1

这一切都很好,但它是“仅” O(n)。毕竟,只有一个循环,并且最多可达 n 1。
考虑时间符号时,所有其他操作都会被丢弃。

但是,我的朋友,有一个问题。

了解因素

如果你仔细想想,因素在某个点之后就会“镜像”。

以数字 81 为例,它的因数为 [1, 3, 9, 27],其中:

  • 1 * 81 = 81
  • 3 * 27 = 81
  • 9 * 9 = 81
  • 27 * 3 = 81
  • 81 * 1 = 81

如果不算数字9,则操作只是重复和翻转。如果将 n 除以它的一个因数,就会得到另一个因数。
期望 n 的平方根,即它本身的平方(废话)。

有了这些知识,我们现在知道我们不需要迭代循环最多 n 次(范围(1, n 1)),而只需迭代到 math.sqrt(n) 即可。之后,我们就得到了我们需要的所有因素!

不太明显的解决方案

现在我们已经拥有了所需的一切,我们需要将这个循环从 1 -> 转换为 1 -> 。 n 至 1 ->开方 n.

我只是将代码放在这里,我们将逐行检查这些行。

def getkthFactorOfN(n, k):
    i = 1
    factors_asc = []
    factors_desc = []
    while i * i 



<p>哦,这要复杂得多。让我们来分解一下:</p>

<p>首先,我们初始化 i = 1。在搜索因子时,该变量将用作“我们当前所在的数字”。</p>

<p>其次,我们将创建两个数组:factors_asc 和 Factors_desc。这里的神奇之处在于,我们将向 Factors_asc 添加因子 - 它们如此命名是因为它们会自动按升序排列。<br>
每当我们向factors_asc添加一些内容时,我们都会将n除以它并将其添加到factors_desc。类似的逻辑在这里;它们将按降序方便地添加。</p><p>然后,我们开始循环。在这里,我将其更改为 while i * i 

</p><p>我们首先检查当前数字是否是一个因子 (n % i == 0)。如果是这样,我们可以将其附加到我们的 Factors_asc 数组中。</p>

<p>接下来,我们得到 i 的“逆因子”。我们可以通过检查 i != n // i 是否,或者换句话说,它是否不是根来做到这一点。这是因为根不能在两个数组中重复。如果不是,我们通过运行 n // i 并将结果附加到 Factors_desc 中来获得反转的因子。</p>

<p>之后,我们将 i 加 1 并继续循环。</p>

<p>循环完成后,我们必须获得所需的所有阶乘。</p>

<p>我们首先通过 if k 

</p><p>如果不是,我们必须减去从 k 中找到的因子数量并再次检查 - k -= len(factors_asc) 并且 k 

</p><p>如果 k 在 Factors_desc 内,则使用 Factors_desk[-k] 获取其值(从最后到第一个)。</p>

<p>如果全部失败,返回-1。</p>

<h2>
  
  
  曲线
</h2>

<p>如果你想知道它落在曲线图中的哪个位置,它会在 <strong>O(n)</strong> 和 <strong>O(log n)</strong> 之间,比前者更好,也更差比后者。这是一个图表:</p>

<p><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/173598658415895.jpg?x-oss-process=image/resize,p_40" class="lazy" alt="The Kth factor of N - an O(sqrt n) algorithm"><br>
<em>Mathspace 提供</em></p>

<h2>
  
  
  结论
</h2>

<p>这是一次发现和研究的旅程。非常感谢您阅读到目前为止。</p>

<p>如果你想更优化,你可以创建factors_asc_len和factors_desc_len变量,并在每次向这些数组追加值时加1,这样就不必调用方法len(),因为该方法是<strong>O(n)</strong> 因此它会影响时间符号。</p>

<p>祝你学习顺利,下次再见!</p>


          

            
        

以上是N 的第 K 个因子 - O(sqrt n) 算法的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
您如何切成python阵列?您如何切成python阵列?May 01, 2025 am 12:18 AM

Python列表切片的基本语法是list[start:stop:step]。1.start是包含的第一个元素索引,2.stop是排除的第一个元素索引,3.step决定元素之间的步长。切片不仅用于提取数据,还可以修改和反转列表。

在什么情况下,列表的表现比数组表现更好?在什么情况下,列表的表现比数组表现更好?May 01, 2025 am 12:06 AM

ListSoutPerformarRaysin:1)DynamicsizicsizingandFrequentInsertions/删除,2)储存的二聚体和3)MemoryFeliceFiceForceforseforsparsedata,butmayhaveslightperformancecostsinclentoperations。

如何将Python数组转换为Python列表?如何将Python数组转换为Python列表?May 01, 2025 am 12:05 AM

toConvertapythonarraytoalist,usEthelist()constructororageneratorexpression.1)intimpthearraymoduleandcreateanArray.2)USELIST(ARR)或[XFORXINARR] to ConconverTittoalist,请考虑performorefformanceandmemoryfformanceandmemoryfformienceforlargedAtasetset。

当Python中存在列表时,使用数组的目的是什么?当Python中存在列表时,使用数组的目的是什么?May 01, 2025 am 12:04 AM

choosearraysoverlistsinpythonforbetterperformanceandmemoryfliceSpecificScenarios.1)largenumericaldatasets:arraysreducememoryusage.2)绩效 - 临界杂货:arraysoffersoffersOffersOffersOffersPoostSfoostSforsssfortasssfortaskslikeappensearch orearch.3)testessenforcety:arraysenforce:arraysenforc

说明如何通过列表和数组的元素迭代。说明如何通过列表和数组的元素迭代。May 01, 2025 am 12:01 AM

在Python中,可以使用for循环、enumerate和列表推导式遍历列表;在Java中,可以使用传统for循环和增强for循环遍历数组。1.Python列表遍历方法包括:for循环、enumerate和列表推导式。2.Java数组遍历方法包括:传统for循环和增强for循环。

什么是Python Switch语句?什么是Python Switch语句?Apr 30, 2025 pm 02:08 PM

本文讨论了Python版本3.10中介绍的新“匹配”语句,该语句与其他语言相同。它增强了代码的可读性,并为传统的if-elif-el提供了性能优势

Python中有什么例外组?Python中有什么例外组?Apr 30, 2025 pm 02:07 PM

Python 3.11中的异常组允许同时处理多个异常,从而改善了并发场景和复杂操作中的错误管理。

Python中的功能注释是什么?Python中的功能注释是什么?Apr 30, 2025 pm 02:06 PM

Python中的功能注释将元数据添加到函数中,以进行类型检查,文档和IDE支持。它们增强了代码的可读性,维护,并且在API开发,数据科学和图书馆创建中至关重要。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。