数组有N+M个数字, 数字的范围为1 ... N, 打印重复的元素, 要求O(M + N), 不可以用额外的空间

数组有N+M个数字, 数字的范围为1 ... N, 打印重复的元素, 要求O(M + N), 不可以用额外的空间

1、题目中要求我们不能使用额外的空间,那么我们能采用在原数组上做文章,这里的重点是如何对相同元素进行标记

2、本文转自:http://www.cnblogs.com/end/archive/2012/02/04/2337796.html

算法思想是对数组的前N-1个元素进行标记,在标记过程中如果发现此位置已被标记,那么说明此时的元素值是重复的,于是打印出来

            int[] arr = {,,,,,,,,,,,,,,,};
foreach (int t in arr)
{
if(arr[Math.Abs(t)]>)
{
arr[Math.Abs(t)] = -arr[Math.Abs(t)];
}
else
{
Console.WriteLine(Math.Abs(t).ToString()); }
}

3、以上代码能够满足面试题目的要求,没有产生额外的空间,时间复杂度为O(m+n),但是会打印出重复的数字,期待有缘人看到这篇随笔之后能提出更好的解决意见和方法

上一篇:BZOJ 3784: 树上的路径


下一篇:c#线程的几种启动方法