这是two sum那道题吧。
很明显用了hash table来储存数据,是为了用O(n)的space来换取O(n)的时间,也就是查找元素的时间是O(1)。
你这样用List,contains查找时间还是O(n)。
跟你直接写个for loop用brute force有什么区别呢?
如果拆开来看,List<T>里面是线序集,HashSet<T>里面是散列表。
与Dictionary<K,V>相比,List<T>可以看成下标到值的映射,HashSet<T>可以看成值自己到自己的映射。判断一个值是否存在,前者相当于是用值去找下标,要遍历一遍容器;后者相当于用映射前的值去找映射后的值,只需要计算出来值的hash,然后直接访问就好了。
简单说,一个时间复杂度O(1),一个时间复杂度O(n)。
而且HashSet无序不重,和List完全不同。
判断一个数组是否包含重复元素,其实只需要一个个添加到HashSet,然后检查Add方法的返回值就可以了:
var set = new HashSet<int>(); foreach( var i in array ) if ( set.Add( i ) == false ) return true; return false;
当然不考虑效率的花式玩法很多,但都比一个个去Contains要性能好:
return array.Length != array.Distinct().Count();
return array.GroupBy( i => i ).Any( g => g.Count() > 1 );
先别刷题了,看下基础数据结构书。