leetcode18:四数之和

题目描述:
给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复)。
0 <= a, b, c, d < n,a、b、c 和 d 互不相同,nums[a] + nums[b] + nums[c] + nums[d] == target 可以按 任意顺序 返回答案 。
示例
1)输入:nums = [1,0,-1,0,-2,2], target = 0
输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]
2)输入:nums = [2,2,2,2,2], target = 8
输出:[[2,2,2,2]]
思路
与15题三数之和相同,三数之和的方法都可以应用在这个问题上。
这里主要是要双指针的方式:

class Solution(object):
    def fourSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[List[int]]
        """
        result = []
        s = sorted(nums)  # 从小到大排序
        for j in range(len(s)-3):
            if j == 0 or s[j] != s[j - 1]:
                for i in range(j + 1, len(s)-2):
                    if i == j+1 or s[i] != s[i - 1]:
                        left = i + 1
                        right = len(s) - 1
                        while left < right:
                            if s[left] + s[right] + s[j] + s[i] > target:
                                right = right - 1
                            elif s[left] + s[right] + s[j] + s[i] == target:
                                result.append([s[i], s[left], s[right], s[j]])
                                while left + 1 < len(s) and s[left] == s[left + 1]:
                                    left = left + 1
                                while right - 1 >= 0 and s[right] == s[right - 1]:
                                    right = right - 1
                                left = left + 1
                                right = right - 1
                            else:
                                left = left + 1
        return result

双指针的方式是很重要的!!!
可以对应15题中使用set的方式来练习一下使用hash表完成本题目。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值