关于PHP求解三数之和问题详析


Posted in PHP onNovember 09, 2020

三数之和

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。

注意:答案中不可以包含重复的三元组。

示例:

给定数组 nums = [-1, 0, 1, 2, -1, -4],

满足要求的三元组集合为:
[
 [-1, 0, 1],
 [-1, -1, 2]
]

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/3sum

解题思路 1

暴力枚举法,三层 for + if 判断就可以了,这样作面试中 offer 会成为别人的。 不写代码了,数据量大了也容易超时。

解题思路 2

可以先固定一个值,然后寻找后两个值时可采取双指针的方法,将总的时间复杂度优化到 O(n^2)。

实现的过程中,要注意优化以及去重。

首先我们先对原数组进行排序,这样可以把重复的值集中到一起,便于去重。

确定第一个元素时,如果它已经比 0 大了,那么可以直接跳出循环,因为后面的数字都比它大。如 [1, 2, 3, 4], i = 0, nums[i] > 0, 这样是不可能产生合法的情况的,直接 break。

确定第一个元素时,如果发现它与它前面的值一样,那么跳过本轮。如 [-1, -1, 0, 1], 在第一轮后,已经选出了 {-1, 0, 1}, 现在 i = 1,nums[i] == nums[i - 1], 为了避免重复,直接 continue。

接下来利用双指针,left 指向 i + 1, right 指向 count($nums) - 1。逐个进行判断,并注意去重。有点类似于固定在一个值,然后剩下的用双指针求两数之和。

class Solution {

 /** * @param Integer[] $nums * @return Integer[][] */
 function threeSum($nums) {
 $result = [];
 $count = count($nums);
 if ($nums === null || count($nums) <= 2) return $result;

 sort($nums); // O(nlogn)

 for ($i = 0; $i < $count - 2; $i++) { // O(n^2)

  if ($nums[$i] > 0) break; // 第一个数大于 0,后面的数都比它大,肯定不成立了

  if ($i > 0 && $nums[$i] === $nums[$i - 1]) continue; // 去掉重复情况

  $target = -$nums[$i];
  $left = $i + 1;
  $right = $count - 1;
  while ($left < $right) {
  if ($nums[$left] + $nums[$right] === $target) {
   $result[] = [$nums[$i], $nums[$left], $nums[$right]];

   // 现在要增加 left,减小 right,但是不能重复,比如: [-2, -1, -1, -1, 3, 3, 3], i = 0, left = 1, right = 6, [-2, -1, 3] 的答案加入后,需要排除重复的 -1 和 3

   $left++;
   $right--; // 首先无论如何先要进行加减操作

   while ($left < $right && $nums[$left] === $nums[$left - 1]) $left++;
   while ($left < $right && $nums[$right] === $nums[$right + 1]) $right--;
  } else if ($nums[$left] + $nums[$right] < $target) {
   $left++;
  } else { // $nums[$left] + $nums[$right] > $target

   $right--;
  }
  }
 }

 return $result;
 }
}

参考链接:

  • 三数之和的官方题解和高赞答案
  • 极客时间 算法面试通关40讲

到此这篇关于PHP求解三数之和问题的文章就介绍到这了,更多相关PHP求解三数之和内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

PHP 相关文章推荐
PHP详细彻底学习Smarty
Mar 27 PHP
phpMyAdmin 链接表的附加功能尚未激活问题的解决方法(已测)
Mar 27 PHP
php标签云的实现代码
Oct 10 PHP
关于php 接口问题(php接口主要也就是运用curl,curl函数)
Jul 01 PHP
smarty简单入门实例
Nov 28 PHP
CentOS下PHP安装Oracle扩展
Feb 15 PHP
phpStudy访问速度慢和启动失败的解决办法
Nov 19 PHP
thinkphp中AJAX返回ajaxReturn()方法分析
Dec 06 PHP
PHP 传输会话curl函数的实例详解
Sep 12 PHP
PHP基于面向对象封装的分页类示例
Mar 15 PHP
ThinkPHP框架整合微信支付之JSAPI模式图文详解
Apr 09 PHP
laravel 判断查询数据库返回值的例子
Oct 11 PHP
PHP中isset、empty的用法与区别示例详解
Nov 05 #PHP
PHP后门隐藏的一些技巧总结
Nov 04 #PHP
phpstudy2020搭建站点的实现示例
Oct 30 #PHP
解决PHPstudy Apache无法启动的问题【亲测有效】
Oct 30 #PHP
PhpStorm 2020.3:新增开箱即用的PHP 8属性(推荐)
Oct 30 #PHP
2020最新版 PhpStudy V8.1版本下载安装使用详解
Oct 30 #PHP
PHP fopen中文文件名乱码问题解决方案
Oct 28 #PHP
You might like
phpQuery占用内存过多的处理方法
2013/11/13 PHP
php环境下利用session防止页面重复刷新的具体实现
2014/01/09 PHP
php连接oracle数据库的方法(测试成功)
2016/05/26 PHP
如何在标题栏显示框架内页面的标题
2007/02/03 Javascript
js loading加载效果实现代码
2009/11/24 Javascript
基于jquery的使ListNav兼容中文首字拼音排序的实现代码
2011/07/10 Javascript
javascript string字符串优化问题
2011/07/31 Javascript
js计算精度问题小结
2013/04/22 Javascript
js中的preventDefault与stopPropagation详解
2014/01/29 Javascript
使用纯javascript实现经典扫雷游戏
2015/04/23 Javascript
利用js实现禁止复制文本信息
2015/06/03 Javascript
提高jQuery性能优化的技巧
2015/08/03 Javascript
基于JavaScript实现瀑布流布局(二)
2016/01/26 Javascript
js简单判断flash是否加载完成的方法
2016/06/21 Javascript
JS 实现计算器详解及实例代码(一)
2017/01/08 Javascript
jQuery实现元素的插入
2017/02/27 Javascript
JS实现微信里判断页面是否被分享成功的方法
2017/06/06 Javascript
基于vue2.x的电商图片放大镜插件的使用
2018/01/22 Javascript
vue-cli开发时,关于ajax跨域的解决方法(推荐)
2018/02/03 Javascript
超详细的5个Shell脚本实例分享(值得收藏)
2019/08/15 Javascript
35个Python编程小技巧
2014/04/01 Python
使用IronPython把Python脚本集成到.NET程序中的教程
2015/03/31 Python
python中format()函数的简单使用教程
2018/03/14 Python
基于python 二维数组及画图的实例详解
2018/04/03 Python
详解pyqt5 动画在QThread线程中无法运行问题
2018/05/05 Python
CSS3简单实现照片墙
2014/12/12 HTML / CSS
巴西购物网站:Estrela10
2018/12/13 全球购物
总经理秘书的岗位职责
2013/12/27 职场文书
会计员岗位职责
2014/03/15 职场文书
应聘教师自荐书
2014/06/16 职场文书
部队反四风对照检查材料
2014/09/26 职场文书
见习报告的格式
2014/11/04 职场文书
给领导的感谢信范文
2015/01/23 职场文书
毕业论文致谢部分怎么写
2015/05/14 职场文书
苹果电脑mac os中货币符号快捷输入
2022/02/17 杂记
Win10玩csgo闪退如何解决?Win10玩csgo闪退的解决方法
2022/07/23 数码科技