2021-05-05

95 篇文章 2 订阅

力扣答题(3)

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
示例:
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum
思路:
暴力破解肯定会超时,用多指针方法比较有效。
1、对数组从小到大进行排序。
2、分别用三个指针指向三个数,称为第一、二、三指针。移动的规则是:第一指针从数组的第一个数,移动到倒数第三个数;第二指针初始状态紧随第一指针之后,第三指针初始状态指向数组最后一个数(最大数)。
3、第二指针和第三指针对向移动,不重叠不交叉。
4、判断三数之和大于0,移动第三指针,小于0移动第二指针,等于0同时移动第二、三指针。
5、按3、4步骤移动第二、第三指针不满足条件后,再移动第一指针,重新确定第二、第三指针的初始位置。

class Solution(object):
    def threeSum(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        nums.sort()
        result = []
        for i in range(len(nums) - 2):
            if nums[i] > 0:
                break
            if i != 0 and nums[i] == nums[i - 1]:
                continue
            k = 0
            for j in range(i + 1, len(nums)-1):
                if j != i+1 and nums[j] == nums[j-1]:
                    continue
                while len(nums) - 1 - k > j:
                    if len(nums)-1-k != len(nums)-1 and nums[len(nums)-1-k] == nums[len(nums)-k]:
                        k += 1
                        continue
                    p = nums[i] + nums[j] + nums[len(nums) - 1 - k]
                    if p == 0:
                        # if [nums[i], nums[j], nums[len(nums) - 1 - k]] not in result:
                        result.append([nums[i], nums[j], nums[len(nums) - 1 - k]])
                        k += 1
                        break
                    elif p > 0:
                        k += 1
                    else:
                        break
        return result
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值