关于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 30 PHP
php防注入,表单提交值转义的实现详解
Jun 10 PHP
解析PHP可变函数的经典用法
Jun 20 PHP
getimagesize获取图片尺寸实例
Nov 15 PHP
PHP获取youku视频真实flv文件地址的方法
Dec 23 PHP
php实现图片上传并利用ImageMagick生成缩略图
Mar 14 PHP
php foreach如何跳出两层循环(详解)
Nov 05 PHP
自制PHP框架之设计模式
May 07 PHP
php利用ffmpeg提取视频中音频与视频画面的方法详解
Jun 07 PHP
php在windows环境下获得cpu内存实时使用率(推荐)
Feb 08 PHP
thinkphp中U方法按路由规则生成url的方法
Mar 12 PHP
php-fpm超时时间设置request_terminate_timeout资源问题分析
Sep 27 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
ThinkPHP利用PHPMailer实现邮件发送实现代码
2013/09/26 PHP
JavaScript 弹出窗体点击按钮返回选择数据的实现
2010/04/01 Javascript
Jquery Autocomplete 结合asp.net使用要点
2010/10/29 Javascript
整理8个很棒的 jQuery 倒计时插件和教程
2011/12/12 Javascript
无刷新上传文件并返回自定义值
2015/06/11 Javascript
javascript汉字拼音互转的简单实例
2016/10/09 Javascript
在网页中插入百度地图的步骤详解
2016/12/02 Javascript
jQuery用户头像裁剪插件cropbox.js使用详解
2017/06/07 jQuery
jQuery实现返回顶部按钮和scroll滚动功能[带动画效果]
2017/07/05 jQuery
vue项目中jsonp跨域获取qq音乐首页推荐问题
2018/05/30 Javascript
利用d3.js力导布局绘制资源拓扑图实例教程
2019/01/08 Javascript
基于vue-cli3创建libs库的实现方法
2019/12/04 Javascript
微信小程序实现可长按移动控件
2020/11/01 Javascript
Python编码时应该注意的几个情况
2013/03/04 Python
Python的函数嵌套的使用方法
2014/01/24 Python
python 字典(dict)遍历的四种方法性能测试报告
2014/06/25 Python
Python基于回溯法子集树模板解决马踏棋盘问题示例
2017/09/11 Python
python实现大转盘抽奖效果
2019/01/22 Python
Python基于mysql实现学生管理系统
2019/02/21 Python
pycharm访问mysql数据库的方法步骤
2019/06/18 Python
python3.7 sys模块的具体使用
2019/07/22 Python
Python closure闭包解释及其注意点详解
2019/08/28 Python
通过实例了解Python str()和repr()的区别
2020/01/17 Python
python实现数字炸弹游戏
2020/07/17 Python
PyCharm 2020.1版安装破解注册码永久激活(激活到2089年)
2020/09/24 Python
孕妇内衣和胸罩:Cake Maternity
2018/07/16 全球购物
重阳节登山活动方案
2014/02/03 职场文书
企业年会主持词
2014/03/27 职场文书
小学标准化建设汇报材料
2014/08/16 职场文书
简单通用的简历自我评价
2014/09/21 职场文书
护士长2014年度工作总结
2014/11/11 职场文书
2014年优秀班主任工作总结
2014/12/16 职场文书
python实现简单的名片管理系统
2021/04/26 Python
Redis5之后版本的高可用集群搭建的实现
2021/04/27 Redis
游戏《铁拳》动画化!2022年年内播出
2022/03/21 日漫
JavaScript parseInt0.0000005打印5原理解析
2022/07/23 Javascript