昨天面试上来就是一个算法,平时基本的算法还行,结果变个法就不会了。。。感觉应该刷一波Leecode冷静下。。。今天抽空看下。

题目就是要求O(n)复杂度求无序列表中第K的大元素

如果没有复杂度的限制很简单。。。加了O(n)复杂度确实有点蒙

虽然当时面试官说思路对了,但是还是没搞出来,最后面试官提示用快排的思想

主要还是设立一个flag,列表中小于flag的组成左列表,大于等于flag的组成右列表,主要是不需要在对两侧列表在进行排序了,只需要生成左右列表就行,所以可以实现复杂度O(n)。

举个例子说明下步骤,比如有列表test_list=[6,5,4,3,2,1],找出第3大的元素,就是4,

如果flag=4:

l_list=[3,2,1]

r_list=[6,5]

因为第3大的元素,r_list长度为2,自然flag就是第3大的元素了,return flag,len(r_list)==k-1,就是结束递归的基线条件。

如果flag=1:

l_list=[]

r_list=[6,5,4,3,2]

问题就变成了求r_list里面第K大的元素了

如果flag=6:

l_list=[5,4,3,2,1]

r_list=[]

相当于求l_list里第k-(len(test_list)-len(r_list)+1)大的元素了,这里就是相当于求l_list=[5,4,3,2,1]第2大的元素

通过这三种情况进行递归,最终返回flag就是目标元素

最差复杂度就是n+n-1+n-2+n-3+......+1=(1+n)n/2,就是O(n²)

当时我就会回答出了最差复杂度肯定是n²啊,面试小哥说平均复杂度,我说计算平均复杂度好像很复杂吧?感觉他也有点蒙,就说每次都是二分的情况的复杂度,

当时竟然回答了个logn*logn。。。最后还是被面试管提示的。。。太尴尬了。。。

实际上如果每次刚好二分,第一次取flag比较次数是n,第二次是n/2,依次下去是n/4,n/8.....n/2

就是n+n/2+n/4....

最最丢人的是计算这个结果还想了一会。。。看样该做点高中上数学了。。。

实际结果自然是n(1+1/2+1/4+1/8+....1/2ⁿ)=2n,复杂度自然就是O(n)了

最后实现代码如下:

#给定一个无序列表,求出第K大的元素,要求复杂度O(n)

def find_k(test_list,k):

flag=test_list[0]

test_list.pop(0)

l_list=[i for i in test_list if i < flag]

r_list=[i for i in test_list if i >= flag]

#结果递归的基线条件

if len(r_list)==k-1:

return flag

elif len(r_list)>k-1:

return find_k(r_list,k)

else:

#因为test_list.pop(0)让test_list少了一个元素,所以下面需要+1

gap=len(test_list)-len(l_list)+1

k=k-gap

return find_k(l_list,k)

if __name__ == '__main__':

test_list = [5, 4, 3, 2, 1,10,20,100]

res=find_k(test_list,1)

print(res)

补充知识:从N个数选取k个数的组合--不降原则(DFS)

原理 :不降原则(看代码前先看一下原理吧)

python 无序列表中第k大元素_Python要求O(n)复杂度求无序列表中第K的大元素实例...相关推荐

  1. python列表求平均值_长篇文讲解:Python要求O(n)复杂度求无序列表中第K的大元素实例...

    本文内容主要介绍了Python要求O(n)复杂度求无序列表中第K的大元素实例,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧! 昨天面试上来就是一个算法,平时基本的算法还行,结果变个法 ...

  2. 网易之小易最近在数学课上学习到了集合的概念,集合有三个特征:1.确定性 2.互异性 3.无序性.需要根据给定的w,x,y,z,求出集合中一共有多少个元素。

    import java.util.HashSet; import java.util.Scanner; import java.util.Set;/*** 小易最近在数学课上学习到了集合的概念,集合有 ...

  3. python内置函数返回序列中最大元素_Python 内置函数 ____________ 用来返回序列中的最大元素。_学小易找答案...

    [单选题]5. an official group of people who have joined together for a particular purpose [单选题]Excel 201 ...

  4. python内置函数可以返回序列中的最大元素_Python内置函数__用来返回序列中的最小元素...

    [判断题]不可以在同一台计算机上安装多个Python版本. [判断题]Python是一种跨平台.开源.免费的高级动态编程语言. [填空题]假设列表对象aList的值为[3, 4, 5, 6, 7, 9 ...

  5. python爬取网页某一个a标签_Python爬虫获取某个网页所有的a标签中的超链接网址...

    Python爬虫获取某个网页所有的a标签中的超链接网址 安装BeautifulSoup 管理员身份运行命令行,然后命令行中输入以下命令: pip install beautifulsoup4 爬虫核心 ...

  6. python中列表实现自加减元素_python初学者知识整合

    python 第一章:概述 1. 概述 Python是一门跨平台.开源.免费的解释型高级动态编程语言. ① 编译:笔译,用理解原文本 ② 解释:口译,逐字逐句解释,不产生新文本 Python中的可迭代 ...

  7. 从当前元素继续寻找_云漫圈 | 寻找无序数组的第k大元素

    戳蓝字"CSDN云计算"关注我们哦! 作者:小灰 来源:程序员小灰 本期封面作者:泰勒太乐 -----  第二天  ----- 题目是什么意思呢?比如给定的无序数组如下: 如果 k ...

  8. python取列表前几个元素_Python下几种从一个序列中取出元素的方法

    使用Python进行数据处理时,有时候会有这样的操作,比如从一个列表或者numpy array中随机取出一个元素,对一个列表中的元素进行shuffle,等等.虽然这些操作也可以通过编写很简短的程序完成 ...

  9. python 列表有几个元素_python怎么向列表中添加多个元素

    python的列表是多变灵活的数据结构,向列表中添加元素,可以使用append()方法,或者extend()方法,还可使用insert()方法.insert() 主要用来插入元素,当向列表末尾添加元素 ...

最新文章

  1. 算法了解:RCNN、SPP-Net、Fast-RCNN、Faster-RCNN
  2. Linux学习笔记(一)Linux常用命令
  3. wxWidgets:wxAppConsole类用法
  4. 加工中心局部坐标系g52设定_CNC加工中心程序代码大全,数控加工必备!
  5. 学会查看 RabbitMQ日志
  6. python可以下载百度文库_百度文库随便下载,解除限制
  7. 【渝粤教育】广东开放大学 动画概论 形成性考核 (44)
  8. RMAN backup recovery area 命令
  9. SpringMVC请求后台地址URL没有.*的几种实现方式
  10. Spring Boot后台启动不打印nohup.out
  11. LINUX修改网卡MAC地址
  12. python 逻辑运算的短路问题
  13. Atitit usrqbg1834 html的逻辑化流程化 规范标准化解决方案
  14. 银行转账java mysql_一个银行转账业务模型分析:大魏Java记5-7
  15. 闪讯钳制下Linux系统上网解决方案
  16. C语言ctype常用方法
  17. TortoiseGit状态图标不能正常显示的解决办法
  18. Horizontally Visible Segments
  19. VMware和mobaXterm连接总结
  20. ubuntu账户添加和删除

热门文章

  1. 笨小猴(洛谷P1125题题解,Java语言描述)
  2. 惊现漏洞门!大众汽车被曝安全风险,1分钟内即可轻易解锁
  3. ×××网络连接安全性以及协议支持介绍
  4. linux培训课程第十三天:ppt以及笔记
  5. 生产排期混乱、质量问题难定位?这套生产场景方案全解决,附模板
  6. 当自动化遇见数字化——德资企业儒拉玛特的数字化实践
  7. 给年终总结报告加分的技巧:手机上就能看的可视化长什么样?
  8. 近找到了一个免费的python教程,两周学会了python开发【内附学习视频】
  9. javascript教程:console.log 详解
  10. P8U8 最中听的话,不要做每件事都考虑太多。