数组有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 = {1,4,2,1,6,7,8,3,9,4,3,1,5,7,2,9};
            foreach (int t in arr)
            {
                if(arr[Math.Abs(t)]>0)
                {
                    arr[Math.Abs(t)] = -arr[Math.Abs(t)];
                }
                else
                {
                    Console.WriteLine(Math.Abs(t).ToString());
                    
                }
            }

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

原文地址:https://www.cnblogs.com/chenyongblog/p/3261265.html