如何改进我的FindDuplicate经典算法

时间:2015-04-23 11:55:51

标签: c# loops

我有经典的查找重复算法,如下所示:

int n = int.Parse(Console.ReadLine());
            Console.WriteLine();
            List<int> tempArr = new List<int>();
            List<int> array = new List<int>();
            for (int i = 0; i < n; i++)
            {
                Console.Write("input number {0}: ", i + 1);
                tempArr.Add(int.Parse(Console.ReadLine()));
            }
            tempArr.Sort();
            for (int i = 0; i < n; i++)
            {
                for (int j = i+1; j < n; j++)
                {
                    if (tempArr[i] == tempArr[j])
                    {
                        array.Add(tempArr[i]);
                    }
                }
            }

一切正常,但如果我只有两个重复的数字,如(1, 2,2 ,3,4,5)我怎样才能将它们添加到List<int> **array**在循环中有一个干净的镜头?

3 个答案:

答案 0 :(得分:1)

您可以使用某种具有更好搜索功能的数据结构(例如哈希表或二叉树),而不是列表。即使您只有一个副本,问题是您需要检查是否已在列表中添加了元素,因此算法中的关键操作是搜索。执行搜索的速度越快,算法的速度就越快。使用二分搜索,这是最快的搜索方式,你得到O(nlogn)(你执行n次搜索O(logn))。

更好的方法是使用某种类型的数组,其大小与输入范围相同,并且&#34; tick&#34;你已经拥有的每一个价值。此搜索以恒定时间运行,但如果您有大范围的输入则效率低下。

答案 1 :(得分:0)

您可以使用distinct:

array = tempArr.Distinct().ToList();

Distinct不是线性时间,如果这是你正在寻找的东西(&#34;一个干净的镜头&#34;)。如果您对输入有更多了解,可以在线性时间找到一种方法。例如,如果您知道所采用的整数是否在某个范围内。

答案 2 :(得分:0)

提取您可以使用的所有重复项 Linq

test/java