数组中重复的数字

在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复几次。请找出数组中任意一个重复的数字。

Input:
{2, 3, 1, 0, 2, 5}

Output:
2

解题思路

要求是时间复杂度 O(N),空间复杂度 O(1)。因此不能使用排序的方法,也不能使用额外的标记数组。

对于这种数组元素在 [0, n-1] 范围内的问题,可以将值为 i 的元素调整到第 i 个位置上进行求解。

以 (2, 3, 1, 0, 2, 5) 为例,遍历到位置 4 时,该位置上的数为 2,但是第 2 个位置上已经有一个 2 的值了,因此可以知道 2 重复:

 

程序代码如下:

public class Duplicate {
	
	public int duplicate(int numbers[],int length) {
        int i=0;
        for(i=0;i<length;i++)
        {
            int temp;
            if(numbers[i]!=i)
            {
                temp=numbers[numbers[i]];
                if(temp==numbers[i])
                {
                    
                    return temp;
                }
                else
                {
                    numbers[numbers[i]]=numbers[i];
                    numbers[i]=temp;
                }
            }
        }
        return -1;
    }

	public static void main(String[] args) {
		
		int[] a=new int[] {0,1,2,2,3,5,4};
		System.out.println(new Duplicate().duplicate(a,a.length));
		
	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值