在数组中寻找和为指定值的两个数

题目:在数组中寻找和为指定值的两个数,如arr={1, 2,3,4,7,8} ,指定值sum为12,返回4+8=12

方法1:

采用暴力破解(即穷举),时间复杂度为O(n*n),即对每一个数arr[i],搜索sum-arr[i]在不在数组中。

方法2:

根据方法1,如果数组已经排好序,可以使用二分查找sum-arr[i];如果没有排好序可以使用某种排序算法对其先进行排序(如平均复杂度为nlogn的快排(取决于划分元的选择,可以选取第一个,或者第一个和中间元素和最后一个的中位数,或者随机选取,或者按照BFPRT算法那样选取等),nlogn的堆排序或者归并排序等)。时间复杂度为nlogn。

方法3:

可以采用Hash表存储,对于每一个元素arr[i],在Hash表中查找sum-arr[j]是否存在,因为Hash查找的时间复杂度为O(1),所以期望的时间复杂度为O(n),但是因为Hash表空间有限,所以会产生冲突,解决冲突的方法有链表法和开放地址法等,比如链表法在极端情况下,所有元素都存在一个链中,那么就退化为O(n*n),这取决于Hash函数与Hash表的空间大小。这是典型的用空间换取时间。

方法4:

如果只是数组中最多存在一对这样的数,便可以采取下面的方法:

比如arr={1,2,3,4,7,8},sum=12

首先求得sum-arr={11,10,9,8,5,4}

然后定义两个索引标号i与j,i从arr头开始向后移动,j从sum-arr尾开始向前移动,哪个指向的元素小,就先移动到大于等于另一个指向的元素,如果两个指向的元素相等,则选出该元素,继续移动,直到到达边界。选中的两个元素便是结果,如果选出的元素个数小于2则该数组中没有符合条件的。但是该方法有个缺陷,如果含有多对符合条件的元素对,那么最后要从选出的结果中继续寻找。

方法5:

如果数组是无序的,则可以先进行排序(nlogn)。然后定义两个索引标号i与j,分别指向排序后的数组的头和尾,然后i向后移动(++i),j向前移动(++j),到i>=j则停止。

   如果arr[i]+arr[j]=sum,则找到了一对,然后++i和++j,继续寻找;

   如果arr[i]+arr[j]>sum,则--j;

   如果arr[i]+arr[j]<sum,则++i;

到i>=j则停止。

时间复杂度为O(n)。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值