首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在数组中查找两个重复数字的算法,无需排序

在数组中查找两个重复数字的算法,可以使用哈希表来实现。以下是一个简单的 Python 代码示例:

代码语言:python
代码运行次数:0
复制
def find_duplicates(arr):
    hash_table = {}
    duplicates = []

    for num in arr:
        if num in hash_table:
            duplicates.append(num)
        else:
            hash_table[num] = True

    return duplicates

这个算法的时间复杂度为 O(n),其中 n 是数组的长度。它遍历数组中的每个元素,并将其添加到哈希表中。如果元素已经存在于哈希表中,则将其添加到重复数字列表中。最后,返回重复数字列表。

这个算法不需要对数组进行排序,因此它比排序算法更快。同时,它也不需要额外的空间,因为它只使用了一个哈希表来存储数组中的元素。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

排序数组查找数字

排序数组查找数字 题目1:数字排序数组中出现次数 统计一个数字排序数组中出现次数。例如,输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3出现了4次,因此输出4....思路: 2分查找数组第一个k: 1. 如果中间数字大于k,那么k只可能出现在前半段 2. 如果中间数字小于k,那么k只可能出现在后半段 3....一个长度为n-1递增排序数组所有数字都是唯一,并且每个数字都在范围0~n-1之内。范围0~n-1内n个数字中有且仅有一个数字不在该数组,请找出这个数字。...思路:因为数组有序,因此数组开始一些数字与它们下标相同。如果不在数组那个数字记为m,那么所有比m小数字下标都与它们值相同。由于m不在数组,m+1下标正好是m。...如果中间元素值与下标不相等,并且前面一个元素下标与值正好相等,则这个下标就是数组缺失数字。 3. 如果中间元素值与下标不相等,并且前面一个元素下标与值也不相等,怎查找左边。

3.7K20

查找数组重复数字

题目来源于《剑指Offer》面试题3:找出数组重复数字。   // 题目:一个长度为n数组所有数字都在0到n-1范围内。...数组某些数字重复,但不知道有几个数字重复了,   // 也不知道每个数字重复了几次。请找出数组任意一个重复数字。...解决方法有多种,包括数组排序,哈希表法,以及作者推荐重排数组法。...此处介绍自己一个做法,以空间换时间,通过新建数组来实现快速查找,具体做法是新建长度为length数组newArray,初始化值为-1;将numbers数组值依次作为newArray下标和对应值为...: (输出) 数组一个重复数字 // 返回值: // true - 输入有效,并且数组存在重复数字 // false - 输入无效,或者数组没有重复数字

4K60
  • Leetcode算法【34排序数组查找元素】

    之前ARTS打卡,我每次都把算法、英文文档、技巧都写在一个文章里,这样对我帮助是挺大,但是可能给读者来说,一下子有这么多输入,还是需要长时间消化。...所以,后续ARTS打卡,会尝试先将算法以及英文文档拆分开,11月,收获季节,让我们继续前行,秋天收获更多,学习更多。小编与你同行!...Algorithm LeetCode算法 排序数组查找元素第一个和最后一个位置 (https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array...找出给定目标值在数组开始位置和结束位置。 你算法时间复杂度必须是 O(log n) 级别。 如果数组不存在目标值,返回 [-1, -1]。...找到第一个数字前提下,我们从数组尾部往前遍历,遇到第一个目标数字时,就是我们需要第二个目标数字(因为最左边有一个已经存在了,所以必然存在一个最右边数字不会产生找不到情况)。

    2.4K20

    数组重复数字

    题目描述 一个长度为n数组所有数字都在0到n-1范围内。 数组某些数字重复,但不知道有几个数字重复。也不知道每个数字重复几次。请找出数组任意一个重复数字。...例如,如果输入长度为7数组{2,3,1,0,2,5,3},那么对应输出是第一个重复数字2。 解题思路 最简单就是用一个数组或者哈希表来存储已经遍历过数字,但是这样需要开辟额外空间。...如果题目要求不能开辟额外空间,那我们可以用如下方法: 因为数组数字都在0~n-1范围内,所以,如果数组没有重复数,那当数组排序后,数字i将出现在下标为i位置。...现在我们重排这个数组,从头到尾扫描每个数字,当扫描到下标为i数字时,首先比较这个数字(记为m)是不是等于i。...如果是,则接着扫描下一个数字;如果不是,则再拿它和m 位置上数字进行比较,如果它们相等,就找到了一个重复数字(该数字在下标为i和m位置都出现了),返回true;如果它和m位置上数字不相等,就把第

    2.1K30

    【剑指offer|5.排序数组查找数字I】

    0.排序数组查找数字I 1.低效率方法© 通过二分查找找到目标值, 局部时间复杂度O(logN); 然后目标值左右扫描, 直到分别扫描到第一个3和最后一个3, 因为要查找数字长度为N数组可能出现...© 我们考虑怎样更好地利用二分查找,在前面的算法,时间主要消耗一个一个找target,从而找到第一个target和最后一个target上,所以我们能不能用通过某种方式更快地直接找到第一个target...二分查找算法总是先拿数组中间数和target作比较,如果中间数字比target大,则target有可能出现在前半段,下一轮我们只用在前半段找就可以了;如果中间数字比target小,则target有可能出现在后半段...如果中间数字和target相等那?...我们先判断这个数字是不是第一个target,如果这个数字前一个数字不等于target, 那么这个数字刚好就是第一个target ; 如果这个数字前一个数字等于target, 那么第一个target一定就在前半段

    85540

    查找算法双重排序数组中进行快速查找

    假设A是一个n\*n二维数组。它行和列都按照升序排列,给定一个数值x,设计一个有效算法,能快速在数组A查找x是否存在。...同时考虑一个算法效率下界,也就是无论任何算法,它时间复杂度都必须高于某个给定水准。 这道题难度不大,看到排序数组时,我们就应该本能考虑到使用二分查找。...imageMogr2/auto-orient/strip) 最简单方法是,循环遍历整个二维数组,依次查找给定元素是否与给定元素一样,当然这么做算法复杂度是O(n^2),因为没有理由到排序特性,因此效率不高...第二行,折半查找到7时,7比6.5大,此时根据行和列都升序排列条件,我们可以忽略掉7开始子矩阵,也就是[7,8,11,12,15,16],由此一下子就排除掉无需考虑一大堆元素。...竖直方向上查找时,如果元素值比给定数值小,那么该元素同行内左边元素都可以无需考虑,如果元素比给定值大,那么位于元素下方元素都可以不用考虑,如果找到一个比给定数值大最小元素时,如果数组存在给定数值大小相同元素

    1.1K10

    算法-删除已排序数组重复

    ,你需要在原地删除重复出现元素,使得每个元素只出现一次,返回移除后数组新长度。...示例 1: 给定数组 nums = [1,1,2], 函数应该返回新长度 2, 并且原数组 nums 两个元素被修改为 1, 2。 你不需要考虑数组超出新长度后面的元素。...你不需要考虑数组超出新长度后面的元素。...,比如说判断一个重复项,则继续增大,直至重复数组元素这段代码 我们可以这样考虑:实际上第一段代码无论是否数组有所重复,都要将数组遍历下标向前推,所以不妨就将其放在for循环中,因为下标 j 其自增只要不越界...只有不重复赋值并自增; 可见一点:逻辑化简后,代码段更加精炼,并且更加清晰明了 2.我们对于这种判断是需要设计两个快、慢指针;快指针始终增加,慢指针满足一定条件才增加;这样一来就起到了删除数组元素

    3.4K20

    数组重复数字

    """描述一个长度为n数组所有数字都在0到n-1范围内。 数组某些数字重复,但不知道有几个数字重复。也不知道每个数字重复几次。请找出数组任意一个重复数字。...例如,如果输入长度为7数组[2,3,1,0,2,5,3],那么对应输出是2或者3。...存在不合法输入的话输出-1数据范围:0\le n \le 10000 \0≤n≤10000进阶:时间复杂度O(n)\O(n) ,空间复杂度O(n)\O(n)示例1输入:[2,3,1,0,2,5,3]复制返回值...:2复制说明:2或3都是对数据范围:0\le n \le 10000 \0≤n≤10000进阶:时间复杂度O(n)\O(n) ,空间复杂度O(n)\O(n)"""# @param numbers int...整型一维数组# @return int整型#from typing import Listclass Solution: def duplicate(self , numbers: List[int

    1.4K10

    JavaScript算法题:查找数字数组索引

    我们必须对数字数组进行升序排序,并找出给定数字数组位置。 算法说明 将值(第二个参数)插入到数组(第一个参数),并返回其排序数组最低索引。返回值应该是一个数字。...解决方案#1:`.sort()`,. indexOf`()` PEDAC 理解问题:有两个输入:一个数组和一个数字。我们目标是将输入数字输入数组后中排序后,再返回它索引。...示例/测试用例:我们不知道输入数组是以哪种方式排序,但是提供测试用例清楚地表明,输入数组应该从小到大进行排序。 请注意,最后一个测试用例存在边界问题,其中输入数组是一个空数组。...我们目标是将输入数字输入数组后中排序后,再返回它索引。 示例/测试用例:我们不知道输入数组是以哪种方式排序,但是提供测试用例清楚地表明,输入数组应该从小到大进行排序。...这个解决方案需要考虑两个边界情况: 如果输入数组为空,则我们需要返回 0,因为 num 将是该数组唯一元素,所以它在索引为 0 位置。

    2K20

    算法-数字排序数组中出现次数

    题目: 统计一个数字排序数组中出现次数,比如排序数组为{1,2,3,3,3,4,5},那么数字3出现次数就是3。...2.除此之外,我们注意到,任务本质上是查找问题,而且是排序数组,可以尝试用二分查找算法,这样我们可以找到一个3,然后根据这个3向数组两端遍历,找到所有的3,但是如果3是n个呢?...3.最后,我们发现在排序数组,如果我们知道了第一个3和最后一个3出现位置,那么其实也就知道了个数,那么我们能否第一次使用二分查找之后,继续使用二分法,找到两端3?...如果中间数字右侧相邻数不是3,那么最后一个3一定就在中间: ? 所以,我们可以把找第一个和最后一个分成两个问题来考虑,用两个函数分别返回在数组位置,那么他们差值+1就是个数。...个人感觉,二分查找关键在于用一种规则,让每次查找之后范围都可以减半,一次来降低时间复杂度,所以改进二分查找可以很多问题中灵活使用,除了这个,旋转数组最小数字问题中也可以用到,甚至旋转数组最小数字

    88250

    算法养成记:删除排序数组重复

    ,你需要在 原地 删除重复出现元素,使得每个元素只出现一次,返回移除后数组新长度。...示例 1: 给定数组 nums = [1,1,2], 函数应该返回新长度 2, 并且原数组 nums 两个元素被修改为 1, 2。 你不需要考虑数组超出新长度后面的元素。...你不需要考虑数组超出新长度后面的元素。 说明: 为什么返回数值是整数,但输出答案是数组呢? 请注意,输入数组是以「引用」方式传递,这意味着函数里修改输入数组对于调用者是可见。...也就是说,不对实参做任何拷贝 int len = removeDuplicates(nums); // 函数里修改输入数组对于调用者是可见。...// 根据你函数返回长度, 它会打印出数组该长度范围内所有元素。 for (int i = 0; i < len; i++) { print(nums[i]); } ? ? ? ?

    41320

    删除排序数组重复项删除排序数组重复项 II

    Remove Duplicates from Sorted Array 题目大意 对排好序list去重,输出去重后长度,并且不能创建新数组 解题思路 快慢指针 代码 官方答案 数组完成排序后,我们可以放置两个指针...当我们遇到 nums[j] \neq nums[i]nums[j]≠nums[i] 时,跳过重复运行已经结束,因此我们必须把它(nums[j]nums[j])值复制到 nums[i + 1]nums...然后递增 ii,接着我们将再次重复相同过程,直到 jj 到达数组末尾为止。...Remove Duplicates from Sorted Array(从一个有序数组中去除重复数字,返回处理后数组长度) 基础上,可以使每个数字最多重复一次,也就是说如果某一个数字个数大于等于...2个,结果应保留2个该数字

    6.5K20

    寻找数组重复数字

    前言 前面一系列文章分享了数据结构与算法基础知识,接下来分享一些算法解题思路与实现。欢迎各位感兴趣开发者阅读。 问题描述 有一个数组,现要找出数组任意一个重复元素。...它规则如下: 给定一个长度为n数组数组每个元素取值范围为:0~n-1 数组某些数字重复,但是不知道哪些数字重复了,也不知道重复了几次 求数组任意一个重复数字 实现思路 这个问题实现思路有三种...排序方法实现 用排序方法实现分为两步: 先用快速排序数组进行排序 遍历排序数组,如果其相邻两个元素相等就代表数组中有重复数字,将其返回即可。 接下来,我们通过一个例子来验证下上述思路。...动态排序法实现 根据题意可知,数组中元素取值范围在0~n-1,那么就可以得到如下结论: 如果数组没有重复元素,那么第i号元素值一定是当前下标(i) 如果数组中有重复元素,那么有些位置可能存在多个数字...(let i = 0; i < sortArray.length; i++) { // 排序完成后,相邻两个数字相等就代表数组中有重复数字,将其返回

    1.4K10
    领券