关于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+FLASH实现上传文件进度条相关文件 下载
Jul 21 PHP
无需重新编译php加入ftp扩展的解决方法
Feb 07 PHP
解析PHP中empty is_null和isset的测试
Jun 29 PHP
使用php方法curl抓取AJAX异步内容思路分析及代码分享
Aug 25 PHP
Laravel中扩展Memcached缓存驱动实现使用阿里云OCS缓存
Feb 10 PHP
php读取文件内容到数组的方法
Mar 16 PHP
CI框架实现框架前后端分离的方法详解
Dec 30 PHP
关于PHP通用返回值设置方法
Mar 31 PHP
php检查函数必传参数是否存在的实例详解
Aug 28 PHP
TP5(thinkPHP5框架)基于bootstrap实现的单图上传插件用法示例
May 29 PHP
laravel 关联关系遍历数组的例子
Oct 10 PHP
PHP实现页面静态化深入讲解
Mar 04 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
php5数字型字符串加解密代码
2008/04/24 PHP
PHP_Cooikes不同页面无法传递的解决方法
2014/03/07 PHP
PHP实现HTML生成PDF文件的方法
2014/11/07 PHP
JavaScript面向对象之静态与非静态类
2010/02/03 Javascript
javascript json2 使用方法
2010/03/16 Javascript
中文字符串截取的js函数代码
2013/04/17 Javascript
IE6-8中Date不支持toISOString的修复方法
2014/05/04 Javascript
推荐JavaScript实现继承的最佳方式
2014/11/11 Javascript
node.js操作mongoDB数据库示例分享
2014/11/26 Javascript
JS实现黑客帝国文字下落效果
2015/09/01 Javascript
AngularJS使用ngOption实现下拉列表的实例代码
2016/01/23 Javascript
JS验证 只能输入小数点,数字,负数的实现方法
2016/10/07 Javascript
Jquery Easyui对话框组件Dialog使用详解(14)
2016/12/19 Javascript
关于vuex的学习实践笔记
2017/04/05 Javascript
vue.js学习之UI组件开发教程
2017/07/03 Javascript
vue通过watch对input做字数限定的方法
2017/07/13 Javascript
zTree 树插件实现全国五级地区点击后加载的示例
2018/02/05 Javascript
vue+webpack 打包文件 404 页面空白的解决方法
2018/02/28 Javascript
基于vue-element组件实现音乐播放器功能
2018/05/06 Javascript
详解基于Node.js的HTTP/2 Server实践
2018/05/31 Javascript
vue实现购物车结算功能
2020/06/18 Javascript
JavaScript使用setTimeout实现倒计时效果
2021/02/19 Javascript
[02:44]完美大师赛主赛事淘汰赛第二日观众采访
2017/11/24 DOTA
python结合opencv实现人脸检测与跟踪
2015/06/08 Python
python学习入门细节知识点
2018/03/29 Python
python计算n的阶乘的方法代码
2019/10/25 Python
python jenkins 打包构建代码的示例代码
2019/11/29 Python
python 统计文件中的字符串数目示例
2019/12/24 Python
Python内建序列通用操作6种实现方法
2020/03/26 Python
世界上最大的在线汽车租赁预订平台:Rentalcars.com(支持中文)
2018/10/12 全球购物
迪卡侬印尼体育用品商店:Decathlon印尼
2020/03/11 全球购物
如何执行一个shell程序
2012/11/23 面试题
学生会竞选演讲稿怎么写
2014/08/26 职场文书
入党团支部推荐意见
2015/06/02 职场文书
教你利用python实现企业微信发送消息
2021/05/23 Python
sentinel支持的redis高可用集群配置详解
2022/04/01 Redis