首页 > 其他分享 >18. 四数之和(中)

18. 四数之和(中)

时间:2024-01-27 10:55:55浏览次数:17  
标签:四数 target nums 18 right res 指针 left

目录

题目

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

题解:排序+双指针

  • 沿用三数之和的代码,在外部多加一个for循环控制多加的一个数,剪枝操作不合适容易把正确结果剪去。
class Solution:
    def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
        res = []# 存储符合条件的四元组
        nums.sort()# 对数组进行排序,方便后续处理
        for j in range(len(nums)):
            if nums[j] > 0 and target > 0 and nums[j] > target:#剪枝
                return res
            if j > 0 and nums[j] == nums[j - 1]:#去重
                continue
            for i in range(j + 1, len(nums)):
                # if nums[i] > 0 and target > 0 and nums[i] > target:#这个地方不能剪枝,比如nums=[-5,5,4,-3,0,0,4,-2]target=4在[-5,0,4,5]就返回了,会漏掉[-3,-2,4,5]结果
                #     return res
                if i > j + 1 and nums[i] == nums[i - 1]:#去重
                    continue

                left = i + 1#初始化指针left
                right = len(nums) - 1#初始化指针right

                while left < right:
                    Sum = nums[i] + nums[left] + nums[right] + nums[j]
                    if Sum == target:#找到符合条件的值
                        res.append([nums[j], nums[i], nums[left], nums[right]])#加入结果集
                        while left < right and nums[left] == nums[left + 1]:#去重
                            left += 1
                        while left < right and nums[right] == nums[right - 1]:#去重
                            right -= 1
                        left += 1#遇到满足条件的值后指针移动
                        right -= 1
                    elif Sum > target:#没遇到满足条件的值,判断Sum与target大小移动指针
                        right -= 1
                    else:
                        left += 1
        return res

标签:四数,target,nums,18,right,res,指针,left
From: https://www.cnblogs.com/lushuang55/p/17990755

相关文章

  • IU5186兼容IU5180集成30V的OVP功能,3A升降压充电,1~4节锂电池
    IU5186C是一款自动申请快充输入,开关模式升降压充电管理IC,用于1~4节锂离子电池和锂聚合物电池,以及1~5节磷酸铁锂电池。芯片集成包括4开关MOSFET、输入和充电电流感应电路、电池以及升降压转换器的环路补偿。芯片具有3A的充电电流能力,充电电流可以通过外部电阻灵活可调。IU5186C内置......
  • KY188 哈夫曼树C++
    用(优先队列)小根堆,先构建哈夫曼树,然后在递归遍历输出WPL。 #include<iostream>#include<queue>usingnamespacestd;structnode{intdata;structnode*left;structnode*right;};typedefstructnodetree;booloperator<(treeleft,treeright){......
  • 寒假生活指导18
    fromseleniumimportwebdriverfromselenium.webdriver.common.byimportByfromselenium.webdriver.support.uiimportWebDriverWaitfromselenium.webdriver.supportimportexpected_conditionsasEC#设置Edge浏览器选项option=webdriver.EdgeOptions()option.......
  • OpenCloudOS 迁移工具征集中,18 万奖金等你来拿!|开放原子开源大赛
    2023 年,由开放原子开源基金会承办的首届「开放原子开源大赛」面向全球开启。OpenCloudOS 社区以「OpenCloudOS 8 至 OpenCloudOS 9 操作系统迁移工具研发」为赛题参与基础软件赛道。为了帮助用户更好的从OpenCloudOS8迁移到OpenCloudOS9,需要研发更可靠的迁移工具,并在迁......
  • OpenCloudOS 迁移工具征集中,18 万奖金等你来拿!|开放原子开源大赛
    2023 年,由开放原子开源基金会承办的首届「开放原子开源大赛」面向全球开启。OpenCloudOS 社区以「OpenCloudOS 8 至 OpenCloudOS 9 操作系统迁移工具研发」为赛题参与基础软件赛道。为了帮助用户更好的从OpenCloudOS8迁移到OpenCloudOS9,需要研发更可靠的迁移工具,并在......
  • 文心一言 VS 讯飞星火 VS chatgpt (187)-- 算法导论14.1 4题
    四、用go语言,写出一个递归过程OS-KEY-RANK(T,k),以一棵顺序统计树T和一个关键字k作为输入,要求返回k在由T表示的动态集合中的秩。假设T的所有关键字都不相同。文心一言,代码正常运行:以下是用Go语言编写的递归过程OS-KEY-RANK(T,k),用于返回关键字k在由T表示的动态集合......
  • 18、拷贝构造、赋值构造、移动构造的简洁代码实现
    classBuffer{public:explicitBuffer(intcapacity):capacity_(capacity),len_(0),buff_(newchar[capacity]{0}){std::cout<<"默认的构造函数"<<std::endl;};~Buffer(){};Buffer(constBuffer&other)n......
  • 文心一言 VS 讯飞星火 VS chatgpt (186)-- 算法导论14.1 3题
    三、用go语言,写出OS-SELECT的非递归版本。文心一言:下面是使用Go语言编写的OS-SELECT的非递归版本:funcOS_SELECT(T*Node,kint)*Node{//找到最小秩的节点minRankNode:=findMinRankNode(T)//如果最小秩的节点就是目标节点,则返回该节点if......
  • 从CF1819A学习mex相关问题及assert调试宏
    Problem-1819A-Codeforces快速计算mexintcalcMex(vector<int>v){ sort(v.begin(),v.end()); v.erase(unique(v.begin(),v.end()),v.end()) intn=int(v.size());for(inti=0;i<n;++i)if(v[i]!=i)returni;returnn;}<cass......
  • CF-1184-E3-最小生成树+倍增+并查集
    1184-E3题目大意给定一个\(n\)个点,\(m\)条边的无向图,边带权。对于每条边,你需要找到最大值\(x\),使得把这条边的权值修改为\(x\)后能够出现在最小生成树上。Solution先把整个图的最小生成树弄出来,然后将边分为树边以及非树边来考虑:非树边:对于一个非树边连接了\(x\)和\(y\)的......