zoukankan      html  css  js  c++  java
  • //如何在数组中找到和为 “特定值” 的三个数?

    第1轮,访问数组的第1个元素1,把问题转化成从后面元素中找出和为12(13-1)的两个数。

    如何找出和为12的两个数呢?我们设置两个指针,指针j指向剩余元素中最左侧的元素2,指针k指向最右侧的元素12:

     计算两指针对应元素之和,2+12 = 14 > 12,结果偏大了。

     由于数组是按照升序排列,k左侧的元素一定小于k,因此我们把指针k左移一位:

     计算两指针对应元素之和,2+9 = 11< 12,这次结果又偏小了。

    j右侧的元素一定大于j,因此我们把指针j右移一位:

     计算两指针对应元素之和,3+9 = 12,正好符合要求!

    因此我们成功找到了一组匹配的组合:1,3,9,已此类推遍历完整个数组

    /**
    * 使用双指针法
    **/
    function threeSum(array $nums,$target){ sort($nums); $resultList = []; $length = count($nums); for($i = 0;$i < $length;$i++){ $d = $target - $nums[$i]; for($j = $i + 1,$k = $length - 1;$j < $length;$j++){ while($j < $k && ($nums[$j] + $nums[$k]) > $d){ $k--; } if($j == $k){ break; } if($nums[$j] + $nums[$k] == $d){ $resultList[] = [$nums[$i],$nums[$j],$nums[$k]]; } } } return $resultList; } print_r(threeSum([5,12,6,3,9,2,1,7],13));
  • 相关阅读:
    「APIO2017」商旅
    【CQOI2017】小Q的表格
    【HNOI2016】树
    【NOI2018模拟】Yja
    测试
    Loj #6073.「2017 山东一轮集训 Day5」距离
    「AHOI / HNOI2017」影魔
    Loj 6068. 「2017 山东一轮集训 Day4」棋盘
    【SDOI2014】向量集
    远程服务器安装nginx
  • 原文地址:https://www.cnblogs.com/nr-zhang/p/13859828.html
Copyright © 2011-2022 走看看