关于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+javascript的日历控件
Nov 19 PHP
php cc攻击代码与防范方法
Oct 18 PHP
PHP以指定字段为索引返回数据库所取的数据数组
Jun 30 PHP
php的4种常见运行方式
Mar 20 PHP
PHP生成plist数据的方法
Jun 16 PHP
Apache连接PHP后无法启动问题解决思路
Jun 18 PHP
php 无限分类 树形数据格式化代码
Oct 11 PHP
PHP图像识别技术原理与实现
Oct 27 PHP
Laravel 批量更新多条数据的示例
Nov 27 PHP
php反射学习之不用new方法实例化类操作示例
Jun 14 PHP
tp5框架基于Ajax实现列表无刷新排序功能示例
Feb 10 PHP
PHP7 新增功能
Mar 09 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中Cannot send session cache limiter 的问题的方法
2007/04/27 PHP
Apache+php+mysql在windows下的安装与配置图解(最新版)
2008/11/30 PHP
php删除与复制文件夹及其文件夹下所有文件的实现代码
2013/01/23 PHP
php查询相似度最高的字符串的方法
2015/03/12 PHP
Laravel 修改验证异常的响应格式实例代码详解
2020/05/25 PHP
php+websocket 实现的聊天室功能详解
2020/05/27 PHP
js获取单元格自定义属性值的代码(IE/Firefox)
2010/04/05 Javascript
jQuery Autocomplete自动完成插件
2010/07/17 Javascript
jquery 插件学习(六)
2012/08/06 Javascript
Javascript获取窗口(容器)的大小及位置参数列举及简要说明
2012/12/09 Javascript
javascript 利用Image对象实现的埋点(某处的点击数)统计
2012/12/28 Javascript
Bootstrap树形组件jqTree的简单封装
2016/01/25 Javascript
浅谈js内置对象Math的属性和方法(推荐)
2016/09/19 Javascript
利用python分析access日志的方法
2016/10/26 Javascript
Angular.js自定义指令学习笔记实例
2017/02/24 Javascript
bootstrap的常用组件和栅格式布局详解
2017/05/02 Javascript
AngularJS 限定$scope的范围实例详解
2017/06/23 Javascript
AngularJS标签页tab选项卡切换功能经典实例详解
2018/05/16 Javascript
深入理解Puppeteer的入门教程和实践
2019/03/05 Javascript
jQuery+ajax实现批量删除功能完整示例
2019/06/06 jQuery
vue实现页面内容禁止选中功能,仅输入框和文本域可选
2019/11/09 Javascript
Vue.js 实现地址管理页面思路详解(地址添加、编辑、删除和设置默认地址)
2019/12/11 Javascript
深入分析jQuery.one() 函数
2020/06/03 jQuery
vue监听滚动事件的方法
2020/12/21 Vue.js
跟老齐学Python之集合的关系
2014/09/24 Python
全面了解Nginx, WSGI, Flask之间的关系
2018/01/09 Python
python 实现从高分辨图像上抠取图像块
2020/01/02 Python
html5 datalist 选中option选项后的触发事件
2020/03/05 HTML / CSS
消防器材管理制度
2014/01/28 职场文书
企业内控岗位的职责
2014/02/07 职场文书
2014年最新学习全国两会精神心得
2014/03/17 职场文书
高中学生期末评语
2014/04/25 职场文书
学习经验演讲稿
2014/05/10 职场文书
色戒观后感
2015/06/12 职场文书
2016年“世界环境日”校园广播稿
2015/12/18 职场文书
文明和谐家庭事迹材料(2016精选版)
2016/02/29 职场文书