关于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中使用Oracle数据库(3)
Oct 09 PHP
PHP中通过加号合并数组的一个简单方法分享
Jan 27 PHP
PHP中改变图片的尺寸大小的代码
Jul 17 PHP
基于PHP CURL获取邮箱地址的详解
Jun 03 PHP
PHP处理Json字符串解码返回NULL的解决方法
Sep 01 PHP
PHP生成RSS文件类实例
Dec 05 PHP
PHP实现格式化文件数据大小显示的方法
Jan 03 PHP
php实现scws中文分词搜索的方法
Dec 25 PHP
PHP实现将MySQL重复ID二维数组重组为三维数组的方法
Aug 01 PHP
php获取指定数量随机字符串的方法
Feb 06 PHP
浅谈PHP的排列组合(如输入a,b,c 输出他们的全部组合)
Mar 14 PHP
IOS 开发之NSDictionary转换成JSON字符串
Aug 14 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
php程序效率优化的一些策略小结
2010/07/17 PHP
PHP通用检测函数集合
2011/02/08 PHP
php时间戳格式化显示友好的时间函数分享
2014/10/21 PHP
php实现的简单检验登陆类
2015/06/18 PHP
对YUI扩展的Gird组件 Part-2
2007/03/10 Javascript
在Javascript中 声明时用&quot;var&quot;与不用&quot;var&quot;的区别
2013/04/15 Javascript
JS this作用域以及GET传输值过长的问题解决方法
2013/08/06 Javascript
JSONP跨域的原理解析及其实现介绍
2014/03/22 Javascript
js原型继承的两种方法对比介绍
2014/03/30 Javascript
jquery中ajax处理跨域的三大方式
2016/01/05 Javascript
浅谈JS之iframe中的窗口
2016/09/13 Javascript
angularjs实现的购物金额计算工具示例
2018/05/08 Javascript
node版本管理工具n包使用教程详解
2018/11/09 Javascript
Python实现一个转存纯真IP数据库的脚本分享
2017/05/21 Python
Python基于QRCode实现生成二维码的方法【下载,安装,调用等】
2017/07/11 Python
python基本语法练习实例
2017/09/19 Python
python3监控CentOS磁盘空间脚本
2018/06/21 Python
Python3模拟curl发送post请求操作示例
2019/05/03 Python
python3下载抖音视频的完整代码
2019/06/05 Python
Python中断多重循环的几种方式详解
2020/02/10 Python
python shell命令行中import多层目录下的模块操作
2020/03/09 Python
Python devel安装失败问题解决方案
2020/06/09 Python
PyInstaller运行原理及常用操作详解
2020/06/13 Python
Python 使用 PyQt5 开发的关机小工具分享
2020/07/16 Python
纯CSS3代码实现switch滑动开关按钮效果
2016/08/30 HTML / CSS
html5记忆翻牌游戏实现思路及代码
2013/07/25 HTML / CSS
HTML5 manifest离线缓存的示例代码
2018/08/08 HTML / CSS
Pandora德国官网:购买潘多拉手链、戒指、项链和耳环
2020/02/20 全球购物
人力资源管理专业毕业生推荐信
2013/11/07 职场文书
社会工作专业自荐信
2014/09/26 职场文书
灵魂歌王观后感
2015/06/17 职场文书
公司管理制度范本
2015/08/03 职场文书
股东出资协议书
2016/03/21 职场文书
MySQL系列之七 MySQL存储引擎
2021/07/02 MySQL
Springboot如何同时装配两个相同类型数据库
2021/11/17 Java/Android
MySQL数据库中的锁、解锁以及删除事务
2022/05/06 MySQL