数组中找到重复的数字

1、要求从一个数组中获取最小的重复的数字,乱序数组,给定范围:长度n,大小0~n-1

class solution
{
public:
    bool findDuplicate(int nums[],int length,int *p)
    {
        if(nums == nullptr)
        {
            cout<<"数组不存在,请检查"<<endl;
            return false;
        }

        for(int i=0; i<length; i++)
            if(nums[i]<0 || nums[i] > length-1)
            {
                cout<<"输入不合法,请检查"<<endl;
                return false;
            }

        int temp;
        for(int i=0; i<length; i++)
        {
            while(nums[i] != i)
            {
                if(nums[i] == nums[nums[i]])
              {
                  *p = nums[i];
                    return true;
                }
                temp = nums[i];
                nums[i]= nums[temp];
                nums[temp] = temp;
            }
        }
    }
};

分析题目,发现条件本身比较苛刻,说明数组是有特殊解法的,由于范围被限制在数组长度以内的大小,因此可以通过数组实现一个简单的哈希表,即将下标作为key以及value,当前位置如果不是正确的值,则去和应该所处在的位置的值进行交换,如果当前

位置和即将交换的位置值一致,则说明该位置上对应的数字是重复。之所以采用这种方式是因为,哈希查找的效率是O(1),因此整体算法的时间复杂度为O(n),空间复杂度为O(1).

2、进一步要求不可以修改数组

思路:以空间换时间,格外声明一个数组,按第一种方式存储,查找,返回。时间复杂度O(n),空间复杂度O(n)

或者以时间换空间,由于重复数字的存在,那么由二分法可以不断划分数组,在某个区间,由于重复数字出现的原因,会出现[m,n]之间的数字个数大于n-m+1个。时间复杂度O(nlogn),空间复杂度O(1)(不推荐,这里并不能确定找出所有重复数字)

这里就不放算法了。

原文地址:https://www.cnblogs.com/jianbo1995/p/9496491.html

时间: 2024-10-01 00:37:38

数组中找到重复的数字的相关文章

《剑指offer》:[51]数组中的重复数字

题目:在一个长度为n的数组里所有数字都在0到n-1的范围里.数组中某些数字是重复的,但是不知道有几个数字重复了,也不知道每个数字重复几次.请找出数组中任意一个重复的数字.例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3. 分析:其实这个题因为它的限制太多,这样是这个题失去了泛型,比如里面的数字的范围确定在0到n-1内,还有任意意对即可,不能对任意的数组进行查重操作.下面先来看看这个问题怎么解决吧! 方案一:时间复杂度为O(N*N)的顺序扫描法.从第一

找到数组中唯一重复的数

#include<iostream> #include<algorithm> #include<numeric> using namespace std; int helper1(int a[],int n) { int sum = accumulate(a,a+n,0); int sum2 = n*(n-1)/2; return sum-sum2; } int helper2(int a[],int n) { int bitor = a[0]^0; for(int i

LintCode- 删除排序数组中的重复数字

题目描述: 给定一个排序数组,在原数组中删除重复出现的数字,使得每个元素只出现一次,并且返回新的数组的长度. 不要使用额外的数组空间,必须在原地没有额外空间的条件下完成. 样例 给出数组A =[1,1,2],你的函数应该返回长度2,此时A=[1,2]. 1 public class Solution { 2 /** 3 * @param A: a array of integers 4 * @return : return an integer 5 */ 6 public int removeD

删除排序数组中的重复数字、买卖股票的最佳时机、爬楼梯

题目1:删除排序数组中的重复数字 描述:给定一个排序数组,在原数组中删除重复出现的数字,使得每个元素只出现一次,并且返回新的数组的长度. 不要使用额外的数组空间,必须在原地没有额外空间的条件下完成. 题目2:买卖股票的最佳时机 描述:假设有一个数组,它的第i个元素是一支给定的股票在第i天的价格.如果你最多只允许完成一次交易(例如,一次买卖股票),设计一个算法来找出最大利润. 题目3:爬楼梯 描述:假设你正在爬楼梯,需要n步你才能到达顶部.但每次你只能爬一步或者两步,你能有多少种不同的方法爬到楼顶

LintCode(101)删除排序数组中的重复数字 II

题目 跟进"删除重复数字": 如果可以允许出现两次重复将如何处理? 您在真实的面试中是否遇到过这个题? Yes 样例 给出数组A =[1,1,1,2,2,3],你的函数应该返回长度5,此时A=[1,1,2,2,3]. 分析 与上题思路相同,只需要增加一个记录元素出现次数的变量即可,限制最多出现2次. Python代码 class Solution: """ @param A: a list of integers @return an integer &q

LintCode(100)删除排序数组中的重复数字

题目 给定一个排序数组,在原数组中删除重复出现的数字,使得每个元素只出现一次,并且返回新的数组的长度. 不要使用额外的数组空间,必须在原地没有额外空间的条件下完成. 您在真实的面试中是否遇到过这个题? Yes 样例 给出数组A =[1,1,2],你的函数应该返回长度2,此时A=[1,2]. 分析 对排序数组去重,要求空间复杂度为O(1) 遍历一次数组,将不重复元素保留,重复元素被覆盖,最后删除末尾剩余的元素即可. Python代码 # #100 删除排序数组中的重复数字 # class Solu

100. 删除排序数组中的重复数字

给定一个排序数组,在原数组中删除重复出现的数字,使得每个元素只出现一次,并且返回新的数组的长度. 不要使用额外的数组空间,必须在原地没有额外空间的条件下完成. 样例 给出数组A =[1,1,2],你的函数应该返回长度2,此时A=[1,2]. 这种简单难度的题要训练到第一时间想到解法,先上一个丑的不行的解法 1 int removeDuplicates(vector<int> &nums) { 2 // write your code here 3 if(nums.empty()){ 4

不修改数组找出重复的数字

在一个长度为n+1的数组里的所有数字都在1到n的范围内,所以数组中至少有一个数字是重复的. 请找出数组中任意一个重复的数字,但不能修改输入的数组. 例如,如果输入长度为8的数组{2, 3, 5, 4, 3, 2, 6, 7},那么对应的输出是重复的数字2或者3. 思路 按照二分查找的思路 数组长度为n+1,而数字只从1到n,说明必定有重复数字. 可以用二分查找扩展{2, 3, 5, 4, 3, 2, 6, 7} 取中间数4 统计1-4,5-7 在数组出现的次数 1-4 出现了5次,如果大于4则在

不修改数组找出重复的数字(c语言)

让人瑟瑟发抖的面试题... 来我们看一下题目在一个 长度为n+1的数组里的所有数字都在1~n的范围内,所以数组中至少有一个数字是重复的.请找出数组中任意一个重复的数字,但不能修改输入的数组.注意:时间复杂度O(n),空间复杂度O(1) 找出数组中重复的数字(c语言)怎么解决勒???分析:利用题目中元素处于1~n的范围,把元素分为两组,判断两组元素个数,如果大于范围,则重复的数字就在这个范围内.例如:1~3范围中有4个数,说明其中至少有一个重复的数字.按此二分下去,将会剩下一个数字有两个,最后输出