Python中怎么找出数组的重复数字,思路方法是什么
Admin 2022-08-26 群英技术资讯 361 次浏览
在上一篇博客中剑指Offer之面试题3: 数组中重复的数字中,其实能发现这类题目的关键就是一边遍历数组一边查满足条件的元素。
然后我们在博客用最复杂的方式学会数组(Python实现动态数组)这篇博客中介绍了数组这一结构的本质,并自己动手实现了一个动态数组。
今天我们介绍一下另一道来自《剑指Offer》的关于数组的面试题——不修改数组找出重复的数字。
题目二:不修改数组找出重复的数字
给定一个长度为 n+1 的数组里的所有数字都在 0∼n 的范围内,所以数组中至少有一个数字是重复的。
请找出数组中任意一个重复的数字,但不能修改输入的数组。
样例:
给定长度为8的数组 nums = [2, 3, 5, 4,3, 2, 6,7]
那么输出重复的数字2或者3
首先我们得关注到,题目要求是:不修改数组,然后还是 返回任意一个重复的数字 。所以解题思路相比而言变少了:
1.哈希表:跟上一题一样,本题也可以创建一个哈希表,如果原数组的每个数字第一次出现,就把他放到哈希表中去,即原数组大小为m的数字应该放到哈希表下标为m的位置上。空间复杂度是 $O(n)$ 。
2.二分法:那么有没有不用空间复杂度 $O(n)$ 的算法。假设没有重复数,那么1~n 之间,每个数都只能出现一次。而题目中,这个数组至少有一个数字重复,即出现的次数大于1。
利用二分的思想:把 1~n 的数字从中间数字 m 开始分为两部分,前一半为 1~ m,后面一半为 m+1 ~n,如果 1~m 中的数字在数组中出现的次数大于 m,那么这一半必定有重复的数字;
否则,那么另一部分必定含有重复数字。接着我们,继续对含有重复数字的区间一分为二,直到找到重复的数字。
def find_duplicated_num(nums): """hash_map""" hash_map = dict() for i, val in enumerate(nums): if val in hash_map: return val hash_map[val] = i return False
def reduce_inter(nums2, left, right): """ """ mid = (left + right) // 2 count = 0 length = len(nums2) for i in range(length): if (nums2[i] >= left) and (nums2[i] <= mid): count += 1 if count > mid - left + 1: return left, mid else: return mid+1, right def find_duplicated_num2(nums2): left, right = 1, len(nums2) - 1 while left != right: left, right = reduce_inter(nums2, left, right) return left
nums = [2, 3, 5, 4, 3, 2, 6, 7] # nums_n = [5, 4, 3, 2, 6, 7] print("思路一测试结果: ", find_duplicated_num(nums)) print("思路二测试结果: ", find_duplicated_num2(nums))
结果
思路一测试结果: 3
思路二测试结果: 3
其实,这种算法不能保证找出所有重复的数字,比如不能找出[2, 3, 5, 4, 3, 2, 6, 7]重复数字2。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
Python 程序能用很多方式处理日期和时间,转换日期格式是一个常见的功能。Python 提供了一个 time 和 calendar 模块可以用于格式化日期和时间。_来自Python3 教程,w3cschool编程狮。
这篇文章主要介绍了Python处理mat文件的三种方式小结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
在给计算机编程时,经常需要将数据告诉计算机,会将二进制数直接输入计算机, 但二进制数的特点是,只有0和1两种记数,位数比较长。如果用二进制数写程序,只要这个数比较大, 位数就会很长,很容易写错,同时二进制并不直观,写出来的数是否正确,需要转换才能知道。
对List进行排序,Python提供了两个方法方法1用List的内建函数listsort进行排序listsort(func=None,key=None,reverse=False)Python实对List进行排序,Python提供了两个方法方法1.用List的内建函数list.sort进行排序list.sort(func=None,key=None,reverse=False
内容介绍利用whileTrue:+sleep()实现定时任务使用Timeloop库运行定时任务利用threading.Timer实现定时任务利用内置模块sched实现定时任务利用调度模块sche
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008