当前位置: 首页 > 后端技术 > Python

力扣15.三数之和Python实现

时间:2023-03-25 23:15:54 Python

题目要求:思路是定义一个res[]来保存结果集。先对数组进行排序,这样如果遇到重复的数,可以直接进入下一个遍历数组,只遍历数组下标的位置从0到数组长度-2。即如果nums[i]+nums[i+1]+nums[i+2]之和大于0,则说明当前遍历位置之后的所有元素的三个元素之和一定大于大于0,因为数组是有序的,此时跳出循环。如果当前元素与数组最后两个元素之和小于零,说明当前元素太小,两个最大数之和小于零。此时直接遍历下一个数组元素(继续)如果数组下标大于0,且当前元素等于上一个元素,则直接遍历下一个数组元素(继续)定义一个l(左)在循环中,l的值为当前数组元素在下标i的后面,定义一个r(右),为数组元素的最后一位,即nums[i]为当前值,剩下的两个值应该是从左到右,从右到左到中间查找,直到l和r重合,在用l和r遍历i右边的数组元素时,定义一个tmp保存和当前的nums[i],nums[l],nums[r]如果当前tmp等于0,则表示找到三个数,追加[nums[i],nums[l],nums组成的数组[r]]到res结果集中,然后用while循环寻找下一个不等于当前nums[l的元素的下标]的数组元素,判断条件是l小于l,当前l是否等于下一个l+1数组元素的值,如果相等,直接给l加1,r相同,查找不重复元素后最后,当前l是等于当前nums[l]值的最后一位,所以给l加1,r也一样。如果当前tmp值小于0,说明当前r和l之和太小,如果当前tmp值大于0,l加一,说明当前r和l之和太大,r减一最终会返回结果集res核心代码:#n为数组长度n=len(nums)#用来保存结果集res=[]#对数组进行排序nums.sort()#遍历sortedarrayforiinrange(n-2):#如果当前值与下一个值和下一个值的和大于0,则后面不会有和等于0,因为数组是有序的,此时跳出循环ifnums[i]+nums[i+1]+nums[i+2]>0:break#如果当前值与数组中最后一个的和两个值小于0,表示当前值太小,继续遍历下一个元素ifnums[i]+nums[n-2]+nums[n-1]<0:continue#如果当前元素下标不为0,且当前元素与前一个元素的值相等,说明元素重复,直接遍历下一个ifi>0andnums[i]==nums[i-1]:continue#l用来表示下一个的i,和r用来表示数组的最后一个元素,r和l向中心靠拢,寻找下标为i,r,l和0的元素l=i+1r=n-1#当l为lessthanr,loopwhilel0:breakifnums[i]+nums[n-2]+nums[n-1]<0:如果i>0且nums[i]==nums[i-1]:继续l=i+1r=n-1而l