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

数组中重复的数字

题目描述 在一个长度为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》中的面试题3:找出数组中重复的数字。   // 题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。...数组中某些数字是重复的,但不知道有几个数字重复了,   // 也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。...例如,如果输入长度为7的数组{2, 3, 1, 0, 2, 5, 3},   // 那么对应的输出是重复的数字2或者3。        ...: (输出) 数组中的一个重复的数字 // 返回值: // true - 输入有效,并且数组中存在重复的数字 // false - 输入无效,或者数组中没有重复的数字...\n"); } // 重复的数字数组中最小的数字 void test1() { int numbers[] = { 2, 1, 3, 1, 4 }; int duplications

    4K60

    寻找数组中的重复数字

    它的规则如下: 给定一个长度为n的数组数组中每个元素的取值范围为:0~n-1 数组中某些数字是重复的,但是不知道哪些数字重复了,也不知道重复了几次 求数组中任意一个重复的数字 实现思路 这个问题的实现思路有三种...排序方法实现 用排序方法实现分为两步: 先用快速排序对数组进行排序 遍历排序好的数组,如果其相邻的两个元素相等就代表数组中有重复的数字,将其返回即可。 接下来,我们通过一个例子来验证下上述思路。...== 3,继续下一轮遍历 i = 2时,i号位置的元素为3,i+1位置的元素是3,3 === 3,数组中有重复数字,存储i号位置的元素,退出循环。...动态排序法实现 根据题意可知,数组中元素的取值范围在0~n-1,那么就可以得到如下结论: 如果数组中没有重复元素,那么第i号元素的值一定是当前下标(i) 如果数组中有重复元素,那么有些位置可能存在多个数字...(let i = 0; i < sortArray.length; i++) { // 排序完成后,相邻的两个数字相等就代表数组中有重复数字,将其返回

    1.4K10

    在排序数组中查找数字

    在排序数组中查找数字 题目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

    旋转数组的最小数字

    题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。...我们注意到旋转之后的数组实际上可以划分为两个排序的子数组,而且前面的子数组的元素都大于或者等于后面子数组的元素。我们还可以注意到最小的元素刚好是这两个子数组的分界线。...indexMid = index2; break; } indexMid = (index1 + index2) / 2; //如果下标为index1、index2和indexMid指向的三个数字相等...index2 ; ++i) { if(result > numbers[i]) result = numbers[i]; } return result; }  注意:当两个指针指向的数字及他们中间的数字三者相同的时候...,我们无法判断中间的数字是位于前面的字数组还是后面的子数组中,也就无法移动两个指针来缩小查找的范围。

    60980

    旋转数组的最小数字

    ,我们称之为数组的旋转。...输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。解题思路将旋转数组对半分可以得到一个包含最小元素的新旋转数组,以及一个非递减排序的数组。...新的旋转数组的长度是原数组的一半,从而将问题规模减少了一半,这种折半性质的算法的时间复杂度为 O(log2N)。此时问题的关键在于确定对半分得到的两个数组哪一个是旋转数组,哪一个是非递减数组。...通过修改二分查找算法进行求解(l 代表 low,m 代表 mid,h 代表 high):当 nums[m] <= nums[h] 时,表示 [m, h] 区间内的数组是非递减数组,[l, m] 区间内的数组是旋转数组...例如对于数组 {1,1,1,0,1},l、m 和 h 指向的数都为 1,此时无法知道最小数字 0 在哪个区间。

    13810

    旋转数组的最小数字

    题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。...例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。 解题思路 采用二分查找法。...需要考虑三种情况: array[mid] > array[high]: 出现这种情况的array类似[3,4,5,6,0,1,2],此时最小数字一定在mid的右边。...low = mid + 1 array[mid] == array[high]: 出现这种情况的array类似 [1,0,1,1,1] 或者[1,1,1,0,1],此时最小数字不好判断在mid左边...high = mid 注意这里有个坑:如果待查询的范围最后只剩两个数,那么mid 一定会指向下标靠前的数字

    47520

    剑指 03— 数组中重复的数字

    数组中重复的数字 难度简单372 找出数组中重复的数字。 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。...数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。...方法二: 原地置换法 注意:数字的范围与数组的长度相同,我们可以把数组看成哈希表 把数组的索引看成哈希表的kye,数组的元素看成哈希表的值val 把值为val的元素放在键也为val的位置上,也就是哈希表键值对的映射关系为...key == val 如果当前数字 nums[i] 和索引 i 不相等,那么应该把 nums[i] 放在索引也为 nums[i] 的位置去,就把索引为 nums[i] 和 i 的数字对换 如果数组在索引为...nums[i] 位置的数在交换前就已经是 nums[i],说明nums[i]是重复数字,返回nums[i] 如果交换后在 nums[i] 仍然不等于 i,要继续交换,这是使用while循环的原因

    59620

    旋转数组的最小数字

    题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。...例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。...= low + (high - low)/2 需要考虑三种情况: (1)array[mid] > array[high]: 出现这种情况的array类似[3,4,5,6,0,1,2],此时最小数字一定在...low = mid + 1 (2)array[mid] == array[high]: 出现这种情况的array类似 [1,0,1,1,1] 或者[1,1,1,0,1],此时最小数字不好判断在mid...high = mid 注意这里有个坑:如果待查询的范围最后只剩两个数,那么mid 一定会指向下标靠前的数字 比如 array = [4,6] array[low] = 4 ;array[mid]

    26040
    领券