LeetCode Two Sum时间复杂度O(n)解法尝试版本2
1、给vector中每个数加上1个足够大的正值,相当于使坐标偏移,让成为HashTable的数组下标的vector中的每个值散布于0及其以上 2、取绝对值
方式2首先排除,因为vector中要是存在绝对值相同但是符号不同(一正一负)的两个数时,一旦进行映射操作,HashTable得值将不是唯一的。但是方式1也有一个问题,题中只是说明vector中的元素类型为int,但并未规定其范围,如果vector中存在足够小或者足够大的值,比如存在-7FFFFFFF,那么整个坐标轴的偏移至少是7FFFFFFF,int可能会溢出的问题倒是可以解决(偏移的7FFFFFFF加任意正数将会使int溢出),使用unsigned方式去存就好了,但是这样大的HashTable是万万不能申请出来的(vector中的最小值-7FFFFFFF,如果还有存在一个不与-7FFFFFFF接近的值存在,也就是说vector中值得取值跨度很大,HashTable将会申请失败)。因此这样的方式其实是有局限性的。
关于合适的值如何取可以参考下图:
代码将会在后续补充;
其实我也想过用其他的数据结构去映射:
1、使用map,依照之前的伪排序的思路去想,map会自动排序,所以先选择map,但是由于operator[]的时间复杂度为对数级别的,一旦我使用一个循环将vector中的数据按照"值-下标"的方式存入map,总体就会超出了O(N)的时间复杂度的目标,即使使用insert也会超出总体O(N),因此使用map是万万不能达到要求的。
2、使用unordered_map,使用此数据结构时,在最理想的情况下,即一个桶中只存了一个vector下标,此时使用查找操作如find或count的耗时就为常数,此时我只需要一个循环,查值"X"与"target - X"是否同时存在即可达成O(N)解题,但不知道vector中的元素间值得关系,因此很难保证一个桶就是一个vector下标,一旦桶中下标数不唯一,总体时间复杂度就又超过了O(N)。
即使有总体时间复杂度O(N)的解法,该解法也是存在着一定的数据取值限制的,适用于无数据取值限制的解法的时间复杂度至少为O(NlogN)