三数之和

三数之和这里我是将用最暴力的三重循环来检验x + y = -z,然后排序过后输出,但是这样时间复杂度为O(n^3) ,LeetCode检验超时。。。,所以参考了一下大佬的算法,这样时间复杂度就变成了O(n^2),但是有时提交还是超时,这对时间复杂度要求也太高了吧。。。

  • 我的垃圾算法
        result = []
        for i in range(len(nums)):
            x = nums[i]
            for j in range((i + 1),len(nums)):
                y = nums[j]
                for k in range((j + 1),len(nums)):
                    z = nums[k]
                    if x + y == -z:
                        temp = [x,y,z]
                        temp.sort()
                        if temp not in result:
                            result.append(temp)
        result.sort()
        return result
  • 大佬的算法
nums.sort()
        result = []
        i = 0
        for i in range(len(nums)):
            if i == 0 or nums[i] > nums[i - 1]:
                left = i + 1
                right = len(nums) - 1
                
                while left < right:
                    res = nums[i] + nums[left] + nums[right]
                    if res == 0:
                        result.append([nums[i], nums[left], nums[right]])
                        left += 1
                        right -= 1
                        #防止相同数
                        while left < right and nums[left] == nums[left - 1]:
                            left += 1
                        while left < right and nums[right] == nums[right + 1]:
                            right -= 1
                        
                    elif res > 0:
                        right -= 1
                    elif res < 0:
                        left += 1
        return result

这个算法的思想是先将数据进行排序,确定一个数x,然后用指针left指向小数,指针right指向大数,若x + nums[left] + nums[right]大于0,则right指针右移,小于0则left指针左移,去除相同数则通过判断指针与上一个数是否相同来判断。

你可能感兴趣的:(三数之和)