题目的意思就是说,给一个数组,在这个数组里面找出三个数的和为0的三个数。将这三个数输出。不能有重复的三个数。
刚开始作者道题的时候,想法是找到0或者和0最近的一个数的位置。然后用两个参数往两边移动。但是这样的话总是会出现一些问题,在提交的时候总是有个别的输入跑出的结果不对。也用过三个循环暴力解决,但是时间超时了。
最后想了想,看了网上别人的代码,将自己的刚开始的想法推翻了。重新用另一种思路解决这个问题。
1、将数组排序,利用sort函数
2、利用两层循环遍历,第一层循环实现i从前到倒数第三个数的遍历。第二层循环实现两个参数指针从i以后的数组的两边实现遍历。
3、当nums[i]和nums[lift]和nums[right]的和大于零的时候,right往左移动。当他们的和小于零的时候,lift往右移动。
4、最重要的是,当他们的和为零的时候,将这三个数放入list中。同时要注意那些nums[i]和nums[right]和nums[lift]重复的数字,利用三个while,分别跳过重复的数字。
5、之后再第一个循环的后面不要忘了将i加一。
下面是实现的代码:
class Solution: def threeSum(self,nums): re = list() i = 0 lift = 0 right = 0 nums.sort() while i < len(nums)-2: lift = i+1 right = len(nums) - 1 while lift < right: if nums[i] + nums[right] + nums[lift] >0: right = right - 1 elif nums[i] + nums[right] + nums[lift] < 0: lift = lift + 1 else: re.append([nums[lift], nums[i], nums[right]]) right = right - 1 while right >lift and nums[right]==nums[right+1]: right = right - 1 lift = lift + 1 while right >lift and nums[lift] == nums[lift-1]: lift = lift + 1 while i < len(nums)-2 and nums[i]==nums[i+1]: i = i +1 i = i + 1 return re