算法学习打卡计划

leetcode第十八题 —— 四数之和

2019-11-19  本文已影响0人  不分享的知识毫无意义

1.题目

原题:

给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。注意:答案中不可以包含重复的四元组。

例子:

给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。
满足要求的四元组集合为:
[  [-1,  0, 0, 1],
  [-2, -1, 1, 2],
  [-2,  0, 0, 2]]

2.解析

这道题的本质是k数相加的问题,之前有类似的两数相加和三数相加问题,这道问题上升为四数相加,如果用暴力求解法,时间复杂度会很高。考虑之前题目的特点,实际上所有的k数相加问题都可以用双指针两端逼近降低算法的复杂度。
先更新一下自己的思路:首先将数组由小到大排列;其次设置双指针,判断数值大小移动指针位置。前两层是循环控制初始的1,2位置,第三个是移动指针m,第四个是移动指针k(数组长度减1)。存在以下情况

3.python代码

class Solution:
    def fourSum(self, nums, target):
        nums.sort()
        print(nums)
        l = len(nums)
        nums_set = []
        for i in range(l):
            for j in range(i+1, l):
                m = j + 1
                k = l - 1
                while m < k:
                    print(i, j, m, k)
                    tmp = nums[i] + nums[j] + nums[m] + nums[k]
                    if tmp == target:
                        nums_set.append([nums[i], nums[j], nums[m], nums[k]])
                        if nums[k] + nums[m] <= sum(nums[m+1:k]):
                            k -= 1
                        else:
                            m += 1
                    elif tmp > target:
                        k -= 1
                    else:
                        m += 1
        # nums_set = [list(a) for a in set([tuple(num) for num in nums_set])]
        return nums_set

附录

做题过程中有一些知识点和错误的地方值得思考,所以把它记录下来。

上一篇 下一篇

猜你喜欢

热点阅读