本帖最后由 小疯纸一枚 于 2014-12-23 01:33 编辑
来一个O(n) 的方法,
1、申请一个 target 长的数组 array ,数组元素全部置0
2、遍历list 当 list[ j ]<target , 如果list [ j ] != target/2 , 设置 array[list [ j ] ]==1 表示访问过,
如果list [ j ] ==target/2 , 第一次设置array[list[ j ]]==1 第二次就再加1
同时构造另一个数组lists2=target-list[ j ]
3、遍历lists2 , 如果 array[list2[ j ]]==0 , 就后移继续找,
如果 array[list2[ j ]]==1 ,如果list2[ j ]!=target/2 , return 10-list2[ j ] , list2[ j ]
如果list2[ j ]==target/2 and array[list[ j ]]-1 ==0
return list2[ j ] , list2[ j ]
else :
array[list[ j ]] - = 1 , 继续后移
遍历两遍数组就能找到 时间复杂度o(n)
例如:list = [4,3,1,5,11,35,7] target=10
第一遍扫描 list 生成 array[0,1,0,1,1,1,0,1,0,0] , len(array)=10 , list2=[6,7,9,5,3]
第二遍扫描 list2 array[6]==0 跳过
array[7]==1 , 找到 return 10-7 , 7
array[9]==0 , 跳过
array[5]==target/2 and array[5]==1 , 修改 array[5]-=1 , 跳过
array[3]==1, 找到 return 10-3 , 3 |