关于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中使用sockets:从新闻组中获取文章
Oct 09 PHP
Zend Studio for Eclipse的java.lang.NullPointerException错误的解决方法
Dec 06 PHP
PHP 出现乱码和Sessions验证问题的解决方法!
Dec 06 PHP
php strcmp使用说明
Apr 22 PHP
PHP小教程之实现链表
Jun 09 PHP
ThinkPHP3.1新特性之对Ajax的支持更加完善
Jun 19 PHP
php数组实现根据某个键值将相同键值合并生成新二维数组的方法
Apr 26 PHP
php7基于递归实现删除空文件夹的方法示例
Jun 15 PHP
php+javascript实现的动态显示服务器运行程序进度条功能示例
Aug 07 PHP
php框架CodeIgniter使用redis的方法分析
Apr 13 PHP
php探针使用原理和技巧讲解
Sep 17 PHP
Laravel 读取 config 下的数据方法
Oct 13 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 pki加密技术(openssl)详解
2013/07/01 PHP
thinkphp3.2中Lite文件替换框架入口文件或应用入口文件的方法
2015/05/21 PHP
php+ajax实现无刷新的新闻留言系统
2020/12/21 PHP
Prototype使用指南之string.js
2007/01/10 Javascript
IE6下CSS图片缓存问题解决方法
2010/12/09 Javascript
ASP.NET jQuery 实例18 通过使用jQuery validation插件校验DropDownList
2012/02/03 Javascript
javascript内存管理详细解析
2013/11/11 Javascript
JavaScript 里的类数组对象
2015/04/08 Javascript
TypeError document.getElementById(...) is null错误原因
2015/05/18 Javascript
js表单验证实例讲解
2016/03/31 Javascript
AngularJS中run方法的巧妙运用
2017/01/04 Javascript
Vue-router路由判断页面未登录跳转到登录页面的实例
2017/10/26 Javascript
深入解读VUE中的异步渲染的实现
2020/06/19 Javascript
微信小程序弹窗禁止页面滚动的实现代码
2020/12/30 Javascript
12步入门Python中的decorator装饰器使用方法
2016/06/20 Python
Python中将字典转换为列表的方法
2016/09/21 Python
python中使用正则表达式的连接符示例代码
2017/10/10 Python
Tensorflow卷积神经网络实例进阶
2018/05/24 Python
Python 类,property属性(简化属性的操作),@property,property()用法示例
2019/10/12 Python
Python多线程模块Threading用法示例小结
2019/11/09 Python
python基于opencv检测程序运行效率
2019/12/28 Python
python3下pygame如何实现显示中文
2020/01/11 Python
python中random.randint和random.randrange的区别详解
2020/09/20 Python
Python Django路径配置实现过程解析
2020/11/05 Python
海滩咖啡馆:Beach Cafe
2018/02/02 全球购物
C#面试问题
2016/07/29 面试题
幼儿园教育教学反思
2014/01/31 职场文书
初中毕业生的自我评价
2014/03/03 职场文书
社团活动总结
2014/04/28 职场文书
个人简历自我评价怎么写
2015/03/10 职场文书
公司年夜饭通知
2015/04/25 职场文书
2015年环卫工作总结
2015/04/28 职场文书
离婚案件被告代理词
2015/05/23 职场文书
2016年社区中秋节活动总结
2016/04/05 职场文书
Django如何与Ajax交互
2021/04/29 Python
教你怎么用PyCharm为同一服务器配置多个python解释器
2021/05/31 Python