关于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 相关文章推荐
详细介绍:Apache+PHP+MySQL配置攻略
Sep 05 PHP
php实现的遍历文件夹下所有文件,编辑删除
Jan 05 PHP
PHPCMS的使用小结
Sep 20 PHP
PHP和Mysqlweb应用开发核心技术 第1部分 Php基础-1 开始了解php
Jul 03 PHP
PHP学习笔记之字符串编码的转换和判断
May 22 PHP
php判断GIF图片是否为动画的方法
Sep 04 PHP
使用php的HTTP请求的库Requests实现美女图片墙
Feb 22 PHP
使用Appcan客户端自动更新PHP版本号(全)
Jul 31 PHP
PHP提高编程效率的20个要点
Sep 23 PHP
Yii2中事务的使用实例代码详解
Sep 07 PHP
PHP实现支付宝即时到账功能
Dec 21 PHP
php读取XML的常见方法实例总结
Apr 25 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
Fatal error: Call to undefined function curl_init()解决方法
2010/04/09 PHP
PhpStorm terminal无法输入命令的解决方法
2016/10/09 PHP
PHP 实现页面静态化的几种方法
2017/07/23 PHP
PHP实现的简单路由和类自动加载功能
2018/03/13 PHP
Ajax+PHP实现的分类列表框功能示例
2019/02/11 PHP
CSS中简写属性要注意TRouBLe的顺序问题(避免踩坑)
2021/03/09 HTML / CSS
jquery遍历数组与筛选数组的方法
2013/11/05 Javascript
$(&quot;&quot;).click与onclick的区别示例介绍
2014/09/25 Javascript
Bootstrap3 多选和单选框(checkbox)
2016/12/29 Javascript
JavaScript自定义分页样式
2017/01/17 Javascript
详解vue2 $watch要注意的问题
2017/09/08 Javascript
JS基于设计模式中的单例模式(Singleton)实现封装对数据增删改查功能
2018/02/06 Javascript
vue element table 表格请求后台排序的方法
2018/09/28 Javascript
详解JavaScript的内存空间、赋值和深浅拷贝
2019/04/17 Javascript
微信小程序换肤功能实现代码(思路详解)
2020/08/25 Javascript
[00:32]10月24、25日 辉夜杯外卡赛附加赛开赛!
2015/10/23 DOTA
haskell实现多线程服务器实例代码
2013/11/26 Python
python算法学习之计数排序实例
2013/12/18 Python
Python中暂存上传图片的方法
2015/02/18 Python
Python实现字符串匹配的KMP算法
2019/04/04 Python
Python实现 版本号对比功能的实例代码
2019/04/18 Python
python实现知乎高颜值图片爬取
2019/08/12 Python
Django后端发送小程序微信模板消息示例(服务通知)
2019/12/17 Python
Python文件操作函数用法实例详解
2019/12/24 Python
浅谈tensorflow中dataset.shuffle和dataset.batch dataset.repeat注意点
2020/06/08 Python
详解tf.device()指定tensorflow运行的GPU或CPU设备实现
2021/02/20 Python
CSS3 创建网页动画实现弹跳球动效果
2018/10/30 HTML / CSS
Html5 new XMLHttpRequest()监听附件上传进度
2021/01/14 HTML / CSS
印度购物网站:TATA CLiQ
2017/11/23 全球购物
Expedia法国:全球最大在线旅游公司
2018/09/30 全球购物
三八活动策划方案
2014/08/17 职场文书
学习十八大宣传标语
2014/10/09 职场文书
同学聚会祝酒词
2015/08/10 职场文书
掌握一个领域知识,高效学习必备方法
2019/08/08 职场文书
PO模式在selenium自动化测试框架的优势
2022/03/20 Python
python中数组和列表的简单实例
2022/03/25 Python