数组中是否有两个数的和为10...

给定一个数组,问其中是否有两个数的和为10?

原文的思路:

1.
比较任意两个数的和是否为10。如
for (int i = 0; i < n; ++i) { for (int j = i+1; j < n; ++j) { .... }}
复杂度为O(n*n)。 

2.
将数组排序后,对每个数m,使用二分查找在数组中寻找10-m。
复杂度为O(nlogn)。 

3.
将数组存储到hash_set中去,对每个数m,在hash_set中寻找10-m。
复杂度为O(n)。 

4.
如果数组很大,超过内存的容量,可以按照hash(max(m, 10-m))%g,将数据分到g个小的group中。然后对每个小的group进行单独处理。
复杂度为O(n)。

 

评论中的思路:

其实也可以先对数组排序,时间复杂度为O(nlgn),然后设两个指针指向数组两端,如果两个指针对应元素之和为10,那么返回true,如果小于10,那么首指针递增,否则尾指针递减,直到两个指针相遇时,如果还是没有和为10的元素对出现,那么返回false。

 

原文链接:http://hi.baidu.com/mianshiti/blog/item/2a625488ccfd801ec9fc7a14.html

自己的思路:

申请一个11个元素大小的辅助数组, 然后对原数组进行遍历, 对于每个元素i,  如果i <= 10, 则将i存放到辅助数组的第i个位置, 这样遍历完原数组, 在在辅助数组中查找是否有两个数和为10, 两个指针, 一个指向头, 一个指向尾, 如果这两个指针指向的元素都存在, 则原数组中存在两个数加和为10...

时间复杂度o(n), 空间复杂度o(1)...

你可能感兴趣的:(存储)