关于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数字格式化
Dec 06 PHP
php设计模式 Strategy(策略模式)
Jun 26 PHP
PhpMyAdmin出现export.php Missing parameter: what /export_type错误解决方法
Aug 09 PHP
PHP+swoole实现简单多人在线聊天群发
Jan 19 PHP
手把手编写PHP框架 深入了解MVC运行流程
Sep 19 PHP
Zend Framework处理Json数据方法详解
Dec 09 PHP
PHP创建单例后台进程的方法示例
May 23 PHP
PHP实现根据密码长度显示安全条
Jul 04 PHP
PHP实现基于栈的后缀表达式求值功能
Nov 10 PHP
PHP简单验证码功能机制实例详解
Mar 27 PHP
关于PHP5.6+版本“No input file specified”问题的解决
Dec 11 PHP
浅谈php常用的7大框架的优缺点
Jul 20 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实例分享之html转为rtf格式
2014/06/02 PHP
Drupal简体中文语言包安装教程
2014/09/27 PHP
JSON用法之将PHP数组转JS数组,JS如何接收PHP数组
2015/10/08 PHP
PHP自带方法验证邮箱、URL、IP是否合法的函数
2016/12/08 PHP
Yii框架日志记录Logging操作示例
2018/07/12 PHP
制作特殊字的脚本
2006/06/26 Javascript
JQuery 浮动导航栏实现代码
2009/08/27 Javascript
firefox和IE系列的相关区别整理 以备后用
2009/12/28 Javascript
jQuery 过滤not()与filter()实例代码
2012/05/10 Javascript
javascript跟随滚动效果插件代码(javascript Follow Plugin)
2013/08/03 Javascript
批量修改标签css样式以input标签为例
2014/07/31 Javascript
JS实现的用来对比两个用指定分隔符分割的字符串是否相同
2014/09/19 Javascript
Javascript中的arguments与重载介绍
2015/03/15 Javascript
js实现文本框宽度自适应文本宽度的方法
2015/08/13 Javascript
jquery实现简单Tab切换菜单效果
2020/07/17 Javascript
AngularJS 过滤器(自带和自建)详解
2016/09/19 Javascript
AngularJs中 ng-repeat指令中实现含有自定义指令的动态html的方法
2017/01/19 Javascript
vue组件如何被其他项目引用
2017/04/13 Javascript
Vue filters过滤器的使用方法
2017/07/14 Javascript
JSON创建键值对(key是中文或者数字)方式详解
2017/08/24 Javascript
Node.js自定义实现文件路由功能
2017/09/22 Javascript
Vue实现PC端靠边悬浮球的代码
2020/05/09 Javascript
JavaScript实现烟花绽放动画效果
2020/08/04 Javascript
Python2.x版本中基本的中文编码问题解决
2015/10/12 Python
Python数据结构与算法之常见的分配排序法示例【桶排序与基数排序】
2017/12/15 Python
tensorflow入门之训练简单的神经网络方法
2018/02/26 Python
通过shell+python实现企业微信预警
2019/03/07 Python
python PyAutoGUI 模拟鼠标键盘操作和截屏功能
2019/08/04 Python
Python @property装饰器原理解析
2020/01/22 Python
OpenCV+python实现实时目标检测功能
2020/06/24 Python
python Scrapy爬虫框架的使用
2021/01/21 Python
独特的礼品和创新的科技产品:The Grommet
2018/02/24 全球购物
欧洲最古老的鞋厂:Peter Kaiser
2019/11/05 全球购物
物业招聘计划书
2014/01/10 职场文书
教师正风肃纪心得体会
2016/01/15 职场文书
pandas:get_dummies()与pd.factorize()的用法及区别说明
2021/05/21 Python