本篇文章给大家分享的是有关利用PHP三数之和进行求解,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
<强>三数之和强>
给你一个包含n个整数的数组num,判断num中是否存在三个元素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 强>
暴力枚举法,三层+如果判断就可以了,这样作面试中提供会成为别人的。不写代码了,数据量大了也容易超时。
<强>解题思路2 强>
可以先固定一个值,然后寻找后两个值时可采取双指针的方法,将总的时间复杂度优化到O (n ^ 2)。
实现的过程中,要注意优化以及去重。
首先我们先对原数组进行排序,这样可以把重复的值集中到一起,便于去重。
确定第一个元素时,如果它已经比0大了,那么可以直接跳出循环,因为后面的数字都比它大。如(1、2、3、4),i=0, num[我]比;0,这样是不可能产生合法的情况的,直接休息。
确定第一个元素时,如果发现它与它前面的值一样,那么跳过本轮。如(1,- 1,0,1],在第一轮后,已经选出了{1 0 1},现我在=1,num[我]==num (i - 1),为了避免重复,直接继续。
接下来利用双指针,左指向我+ 1,右指向count ($ num) - 1。逐个进行判断,并注意去重。有点类似于固定在一个值,然后剩下的用双指针求两数之和。
class Solution { ,/* * *,@param 整数[],nums 美元;*,@return 整数[][]*/,function threeSum (num美元),{ ,result 美元;=,[]; ,count 美元;=,count ($ num); ,if (nums 美元;===,null | |, count ($ num), & lt;=, 2), return 结果美元; ,(num美元);//,O (nlogn) ,for ($小姐:=,0;,美元小姐:& lt;, count 美元;作用;2;,我+ +美元),{,//O (n ^ 2) if 才能;(num美元($ i),祝辞,0),打破,,//,第一个数大于,0,后面的数都比它大,肯定不成立了 if 才能;(美元小姐:祝辞,0,,,,num美元($ i),===, num美元(美元小姐:安康;1]),继续,,//,去掉重复情况 美元才能target =, - num美元($ i); 时间=美元才能left 美元小姐:+,1; 时间=美元才能right count 美元;作用;1; while 才能;(left 美元;& lt;,右)美元,{ if 才能;(num美元(美元离开),+,num美元(美元吧),===,美元目标),{ ,,结果[],美元=,(num美元($ i), num美元(美元离开),,num美元[对美元]];//,,,现在要增加,左,减小,正确,但是不能重复,比如:,(2,1,1,1,3,3,3],,小姐:=,0,,left =, 1, right =, 6日,(2,1,3),的答案加入后,需要排除重复的,1,和3 美元,才能离开+ +; 美元,才能正确的,,//,首先无论如何先要进行加减操作 ,,while (left 美元;& lt;, right 美元;,,,num美元(美元离开),===,num美元[left 美元;作用;1]),美元左+ +; ,,while (left 美元;& lt;, right 美元;,,,num美元(美元吧),===,num美元[right 美元;+,1]),对的——美元; ,,},else if (num美元(美元离开),+,num美元(美元吧),& lt;,美元目标),{ 美元,才能离开+ +; ,,},else {,//num美元(美元离开),+,num美元(美元吧),祝辞,美元的目标 ,才能正确的——美元; ,,} ,,} ,} ,return 美元的结果; ,} }
以上就是利用PHP三数之和进行求解,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。