菜鸟被虐记之《剑指offer》——(题3)

找出数组中重复的数字!!
长度为n的数组,所有数字都在0~n-1的范围内,某些数字可能会重复,找出任意一个重复数字,如 [2, 3, 1, 4, 2, 1],输出 2 或 1

思路1:
对数组进行排序,在遍历数组;时间复杂度过大(nlogn)
思路2:
利用哈希表,哈希表初始化为0;从头到尾扫描原数组,在与元素相等的下标位+1;若与当前数组元素相等的哈希表下标处元素 = 1;则说明该元素重复,改思路时间复杂度O(n),空间复杂度O(n)
思路3:
因为数组元素都在0~n-1的范围内,所以当数组排序之后,如果没有重复数字,则数字 i 会出现在下标 i 处,否则就有重复数字;
利用该特征,从头到尾扫描数组
①当扫描的下标 i 等于该处的元素 m 时,继续扫描;
②当 i != m 时,则用arr[i] 和 arr[m] 处的元素比较,若arr[i] == arr[m],有重复数字,返回;否则,将 arr[i] 和 arr[m] 进行交换,让数字 m 位于下标 m 处;
③用同样的规则遍历数组,若有重复数字,返回该数字;若遍历完了数组,则说明无重复数字

程序代码

bool Duplicate(int *arr, int len, int *val)
{
	if(arr == NULL || len <= 0)
		return false;

	for(int i = 0;i < len; i++)
	{
		if(arr[i] == i)  //arr[i]在自己相应的元素位上
			continue;

		while(arr[i] != i)
		{
			if(arr[arr[i]] == arr[i])  //有重复数字
			{
				*val = arr[i];
				return true;
			}
			else     //交换 arr[i] 和 arr[arr[i]],使arr[i] 在自己对应的元素位上
			{
				int tmp = arr[i];
				arr[i] = arr[tmp];
				arr[tmp] = tmp;
			}
		}
	}
	return false;
}
int main()
{
	int arr[10] = {1,2,3,2,5,6,7,8,9,1};
	int num;  //接受重复数字

	if(Duplicate(arr, 10, &num))
	{
		printf("有重复数字:%d\n", num);
	}
	else
	{
		printf("无重复数字\n");
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值