栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

4. Leetcode 18. 四数之和 (数组-双指针)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

4. Leetcode 18. 四数之和 (数组-双指针)

给你一个由 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]]


具体步骤如下:
1、使用两重循环分别枚举前两个数,然后在两重循环枚举到的数之后使用双指 针枚举剩下的两个数。假设两重循环枚举到的前两个数分别位于下标 i 和 j,其 中 itarget, 说明此时剩下的三个数无论取什么值,四数之和一定大于 target,因此退出第一重 循环; 2、在确定第一个数之后,如果nums[i]+nums[n−3]+nums[n−2]+nums[n−1]target,说 明此时剩下的两个数无论取什么值,四数之和一定大于 target,因此退出第二重循 环;
4、在确定前两个数之后,如果 nums[i]+nums[j]+nums[n−2]+nums[n−1] List[List[int]]:
        result = []
        if not nums or len(nums) < 4:
            return result
        
        nums.sort()
        length = len(nums)
        for i in range(length-3):
            if i > 0 and nums[i]==nums[i-1]:
                continue
            if nums[i] + nums[length-3] + nums[length-2] + nums[length-1] < target:
                continue
            if nums[i] + nums[i+1] + nums[i+2] + nums[i+3] > target:
                break

            for j in range(i+1,length-2):
                if j > i+1 and nums[j]==nums[j-1]:
                    continue
                if nums[i] + nums[j] + nums[length-1] + nums[length-2] < target:
                    continue
                if nums[i] + nums[j] + nums[j+1] + nums[j+2] > target:
                    break
                    
                left, right = j + 1, length - 1
                while left < right:
                    total = nums[i] + nums[j] + nums[left] + nums[right] 
                    if total == target:
                        result.append([nums[i],nums[j],nums[left],nums[right]])

                        left += 1
                        while left < right and nums[left] == nums[left - 1]:
                            left += 1

                        right -= 1
                        while left < right and nums[right] == nums[right + 1]:
                            right -= 1

                    elif total < target:
                        left += 1

                    else:
                        right -= 1

        return result

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/702552.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号