关于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 相关文章推荐
dedecms 制作模板中使用的全局标记图文教程
Mar 11 PHP
可以在线执行PHP代码包装修正版
Mar 15 PHP
PHP 加密/解密函数 dencrypt(动态密文,带压缩功能,支持中文)
Jan 30 PHP
php下使用strpos需要注意 === 运算符
Jul 17 PHP
php中通过正则表达式下载内容中的远程图片的函数代码
Jan 10 PHP
php多种形式发送邮件(mail qmail邮件系统 phpmailer类)
Jan 22 PHP
实例介绍PHP的Reflection反射机制
Aug 05 PHP
php中使用PHPExcel读写excel(xls)文件的方法
Sep 15 PHP
作为程序员必知的16个最佳PHP库
Dec 09 PHP
php HTML无刷新提交表单
Apr 05 PHP
分析php://output和php://stdout的区别
May 06 PHP
设定php简写功能的方法
Nov 28 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位运算的简单权限设计
2013/06/30 PHP
php实现利用phpexcel导出数据
2013/08/24 PHP
PHP的魔术常量__METHOD__简介
2014/07/08 PHP
php中用memcached实现页面防刷新功能
2014/08/19 PHP
PHP+Ajax检测用户名或邮件注册时是否已经存在实例教程
2014/08/23 PHP
PHP动态柱状图实现方法
2015/03/30 PHP
PHP常用的排序和查找算法
2015/08/06 PHP
PHP开发中AJAX技术的简单应用
2015/12/11 PHP
javascript 静态对象和构造函数的使用和公私问题
2010/03/02 Javascript
js通过iframe加载外部网页的实现代码
2015/04/05 Javascript
JavaScript学习笔记整理之引用类型
2016/01/22 Javascript
AngularJS 使用 UI Router 实现表单向导
2016/01/29 Javascript
javascript实现可键盘控制的抽奖系统
2016/03/10 Javascript
Angular.js回顾ng-app和ng-model使用技巧
2016/04/26 Javascript
Markdown+Bootstrap图片自适应属性详解
2016/05/21 Javascript
玩转NODE.JS(四)-搭建简单的聊天室的代码
2016/11/11 Javascript
js实现悬浮窗效果(支持拖动)
2017/03/09 Javascript
详解windows下vue-cli及webpack 构建网站(二)导入bootstrap样式
2017/06/17 Javascript
在Django框架中编写Contact表单的教程
2015/07/17 Python
python3之模块psutil系统性能信息使用
2018/05/30 Python
Python对excel文档的操作方法详解
2018/12/10 Python
python实现BP神经网络回归预测模型
2019/08/09 Python
Django项目后台不挂断运行的方法
2019/08/31 Python
Python 如何优雅的将数字转化为时间格式的方法
2019/09/26 Python
Pytorch 实现计算分类器准确率(总分类及子分类)
2020/01/18 Python
python实现跨excel sheet复制代码实例
2020/03/03 Python
python自动提取文本中的时间(包含中文日期)
2020/08/31 Python
HTML5打开手机扫码功能及优缺点
2017/11/27 HTML / CSS
新加坡航空官方网站:Singapore Airlines
2016/10/13 全球购物
HTC VIVE美国官网:VR虚拟现实眼镜
2018/02/13 全球购物
洛杉矶健身中心女性专用运动服饰品牌:Marika
2018/05/09 全球购物
Huda Beauty官方商店:化妆和美容产品
2020/09/05 全球购物
怎样让char类型的东西转换成int类型
2013/12/09 面试题
毕业生应聘幼儿园的自荐信
2013/11/20 职场文书
PL350与SW11的比较
2021/04/22 无线电