O(n)时间复杂度找到数组中任意一个重复元素

解决思路

用计数排序的思想排序,直到发现重复的结束。
关于计数排序请看:计数排序

代码

#include<stdio.h>
/*检查数组中重复的元素,并输出,数组里面的整数大小不超过n-1,n是数组规模
采用交换下标的方式,时间复杂度为n*/
void exchange(int *a,int j,int i)
{
    int ex;
    ex=a[i];
    a[i]=a[j];
    a[j]=ex;
    return;
}
int main()
{
    int a[10]={1,2,3,5,6,4,1,2,2,5};
    int n=10;
    int i;
    for(i=0;i<n;i++)
    {
        if(a[i]==i)
            continue;
        while(1)
        {
           if(a[i]==a[a[i]])
            {
              printf("%d",a[i]);
              return 0;
           }
           else
              exchange(a,i,a[i]);
           if(a[i]==i)
           {
               break;
           }
        }

    }

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
方法一:哈希表 使用一个哈希表,遍历数组中的每个数,如果该数不在哈希表中,则将其加入哈希表,否则说明该数重复,直接返回即可。 时间复杂度:O(n) 空间复杂度:O(n) 方法二:二分查找 对于数组中元素,由于它们的值都在 1∼n 的范围内,因此可以将数组划分为若干个区间,每个区间的值范围都是 [left, mid] 或 [mid+1, right]。如果整个数组中没有重复元素,那么整个数组中元素个数就是 n,而每个区间的元素个数都是 (mid - left + 1) 或 (right - mid)。 由于题目保证了数组中一定有重复元素,因此可以通过统计整个数组中小于等于 mid 的元素的个数,进而判断重复元素在哪个区间中。假设整个数组中小于等于 mid 的元素个数为 count,如果 count 严格大于 mid,那么重复元素就在区间 [left, mid] 中;否则重复元素在区间 [mid+1, right] 中。这个思路类似于二分查找。 时间复杂度:O(nlogn) 空间复杂度:O(1) 代码实现: 方法一: ```python def findDuplicate(nums: List[int]) -> int: num_set = set() for num in nums: if num in num_set: return num num_set.add(num) ``` 方法二: ```python def findDuplicate(nums: List[int]) -> int: n = len(nums) left = 1 right = n - 1 while left < right: mid = (left + right) // 2 count = 0 for num in nums: if num <= mid: count += 1 if count > mid: right = mid else: left = mid + 1 return left ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值