PHP 查找有序数组中和为n的数对

 1 <?php
 2     #查找有序数组中和为n的数对
 3     #思路是从数组两边开始找,当a[h] + a[t] == n,返回数对
 4     #当a[h] + a[t] < n, h++
 5     #当a[h] + a[t] > n, t--
 6 
 7     function search_n($a, $n) {
 8         $h = 0;
 9         $t = count($a) - 1;
10         $pairs = array();
11 
12         while ($h < $t) {
13             $sum = $a[$h] + $a[$t];
14             if ($n == $sum) {
15                 $pairs[$a[$h]] = $a[$t];
16                 #此处不保存重复的数对,所以首尾坐标同时改变
17                 $h++;
18                 $t--;
19             } else if ($n > $sum) {
20                 $h++;
21             } else {
22                 $t--;
23             }
24         }
25 
26         return $pairs;
27     }
28 
29     #如果数组非有序,可以先用堆排序排序一次
30     $a = array(1, 5, 7, 9, 10, 11, 12, 13, 15, 18, 19);
31     $n = 20;
32     print_r(search_n($a, $n));
33 ?>

Array ( [1] => 19 [5] => 15 [7] => 13 [9] => 11 )

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值