关于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 相关文章推荐
dede3.1分页文字采集过滤规则详说(图文教程)续二
Apr 03 PHP
php学习 函数 课件
Jun 15 PHP
基于curl数据采集之单页面采集函数get_html的使用
Apr 28 PHP
深入PHP运行环境配置的详解
Jun 04 PHP
php设计模式之单例、多例设计模式的应用分析
Jun 30 PHP
PHP中的随机性 你觉得自己幸运吗?
Jan 22 PHP
PHP开发中常用的十个代码样例
Feb 02 PHP
PHP接收App端发送文件流的方法
Sep 23 PHP
PHP有序表查找之插值查找算法示例
Feb 10 PHP
PHP递归统计系统中代码行数
Sep 19 PHP
laravel 框架结合关联查询 when()用法分析
Nov 22 PHP
关于Yii2框架跑脚本时内存泄漏问题的分析与解决
Dec 01 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
使用MaxMind 根据IP地址对访问者定位
2006/10/09 PHP
php数组中删除元素之重新索引的方法
2014/09/16 PHP
php需登录的文件上传管理系统
2020/03/21 PHP
PHP实现Session入库/存入redis的方法
2017/05/04 PHP
php类自动装载、链式操作、魔术方法实现代码
2017/07/23 PHP
PHP 7.4 新语法之箭头函数实例详解
2019/05/09 PHP
javascript 表单规则集合对象
2009/07/21 Javascript
js getBoundingClientRect() 来获取页面元素的位置
2010/11/25 Javascript
原生Js与jquery的多组处理, 仅展开一个区块的折叠效果
2011/01/09 Javascript
jQuery EasyUI API 中文文档 - ProgressBar 进度条
2011/09/29 Javascript
jQuery搜索同辈元素方法
2015/02/10 Javascript
JavaScript实现把rgb颜色转换成16进制颜色的方法
2015/06/01 Javascript
JS在一定时间内跳转页面及各种刷新页面的实现方法
2016/05/26 Javascript
vue+vuex+axio从后台获取数据存入vuex实现组件之间共享数据
2017/04/22 Javascript
JS判断一个数是否是水仙花数
2017/06/11 Javascript
Parcel.js + Vue 2.x 极速零配置打包体验教程
2017/12/24 Javascript
JavaScript动态添加数据到表单并提交的几种方式
2019/06/26 Javascript
Vue3.0中的monorepo管理模式的实现
2019/10/14 Javascript
Vue移动端用淘宝弹性布局lib-flexible插件做适配的方法
2020/05/26 Javascript
Vue实现简单的拖拽效果
2020/08/25 Javascript
跟老齐学Python之数据类型总结
2014/09/24 Python
在Django的URLconf中使用命名组的方法
2015/07/18 Python
Python框架Flask的基本数据库操作方法分析
2018/07/13 Python
python 实现数字字符串左侧补零的方法
2018/12/04 Python
pandas数据集的端到端处理
2019/02/18 Python
纯CSS3实现Material Design效果
2017/03/09 HTML / CSS
css3圆角样式分享自定义按钮样式
2013/12/27 HTML / CSS
CSS3动画和HTML5新特性详解
2020/08/31 HTML / CSS
Html5中localStorage存储JSON数据并读取JSON数据的实现方法
2017/02/13 HTML / CSS
NFL墨西哥官方商店:Tienda NFL
2017/11/28 全球购物
吸烟检讨书2000字
2014/02/13 职场文书
采购部长岗位职责
2014/06/13 职场文书
2015年中秋节主持词
2015/07/30 职场文书
争做文明公民倡议书
2019/06/24 职场文书
如何用PHP websocket实现网页实时聊天
2021/05/26 PHP
正则表达式拆分url实例代码
2022/02/24 Java/Android