Leetcode Hot 1001 分钟
6 次阅读

三数之和

LeetCode 三数之和题解,使用排序+双指针将时间复杂度从O(n^3)优化到O(n^2),并处理重复三元组。

三数之和 封面图

题目

image

https://leetcode.cn/problems/3sum/description/?envType=study-plan-v2&envId=top-100-liked

解法

思路

若按照无序数组来做,至少需要O(n^3)的时间复杂度。

因此可以先进行一个排序(O(nlogn)),引入大小排序。

当确定第i个数后,可以类似于盛水容器的双指针移动思路:三数之和大于0,则右指针向左移动,小于0,则左指针向右移动。 原因:因为是有序的

注意:因为题目中说了相同的三元组只能出现一次,因此需要注意遇到相同数时,除了第一个其余都要跳过

答案

class Solution:
    def threeSum(self, nums: list[int]) -> list[list[int]]:
        nums_sorted = sorted(nums)
        res = []
        for i in range(len(nums_sorted)):
            if i > 0 and nums_sorted[i] == nums_sorted[i-1]:
                continue
            l = i + 1
            r = len(nums_sorted) - 1
            while l < r:
                sum = nums_sorted[i] + nums_sorted[l] + nums_sorted[r]
                if sum > 0:
                    r -= 1
                elif sum < 0:
                    l += 1
                else:
                    res.append([nums_sorted[i] , nums_sorted[l] , nums_sorted[r]])
                    while l < r and nums_sorted[l] == nums_sorted[l+1]:
                        l += 1
                    while l < r and nums_sorted[r] == nums_sorted[r-1]:
                        r -= 1
                    r -= 1
                    l += 1
 
        return res