LeetCode刷题笔记——#18.四数之和

删除回忆录丶 提交于 2020-02-24 19:00:58

难度:中等

一、题目描述:

在这里插入图片描述

二、解题:

排序+指针:

  通过分析题目可以发现,这道题几乎没有限制条件,此外给定的数组可能是乱序,如示例所示。
  暴力解法其实就不需要太多技巧,就不多赘言了。
  为方便解题,先用排序将数组从小到大排序,成为一个有序数组。排序的好处除此之外就是将相同的数放在了一起,这一点就是针对不重复这一个要求。此外还要注意一点,当数组不满足四个数,就不用计算,直接返回。
  说到这就会发现,这和上次的LeetCode刷题笔记——#15.三数之和几乎是一样的。其实这就是它的升级版。我们边看代码边分析。
  我们需要四个指针p, k, i, j

class Solution:
    def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
        nums.sort()
        n = len(nums)
        ans = []
        p = 0 # p, k, i, j
        while p < n - 3:  
        	# 如果最小的数,和次小的数的三倍的和都大于目标值,那肯定没有符合的数了
            if nums[p] + 3 * nums[p + 1] > target: 
            	break  
            # 最大数的三倍加上那个刚好能大于目标的数,就是p的位置,避免了每一次都要把所有的情况检索一遍,节约时间
            if nums[p] + 3 * nums[-1] < target:           
                while p < n - 4 and nums[p] == nums[p + 1]: p += 1
                p += 1
                # continue不加不会影响结果,但是会变慢,通过continue,一些不满足的情况直接跳过
                continue
            k = p + 1
            while k < n - 2:   # k 和 p 的判断是一样的
                if nums[p] + nums[k] + 2 * nums[k + 1] > target: break
                if nums[p] + nums[k] + 2 * nums[-1] < target: 
                    while k < n - 3 and nums[k] == nums[k + 1]:
                        k += 1
                    k += 1
                    continue
                i = k + 1
                j = n - 1
                new_target = target - nums[p] - nums[k]
                while i < j:
                    if nums[i] + nums[j] > new_target: j -= 1
                    elif nums[i] + nums[j] < new_target: i += 1
                    else:
                        ans.append([nums[p],nums[k],nums[i],nums[j]])
                        i += 1
                        j -= 1
                        while i < j and nums[i] == nums[i - 1]: i += 1 # 避免结果重复
                        while i < j and nums[j] == nums[j + 1]: j -= 1 # 避免结果重复
                while k < n - 3 and nums[k] == nums[k + 1]: k += 1
                k += 1
            while p < n - 4 and nums[p] == nums[p + 1]: p += 1
            p += 1
        return ans

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!