【LeetCode】18. 四数之和

news/2024/11/25 13:23:41/

1 问题

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

2 答案

自己写的,感觉没问题

class Solution:def fourSum(self, nums: List[int], target: int) -> List[List[int]]:n = len(nums)res = []nums.sort()for i in range(n):if i>0 and nums[i]==nums[i-1]:continuefor j in range(i+1, n):if j>1 and nums[j]==nums[j-1]:continueL = j+1R = n-1while L<R:if nums[i]+nums[j]+nums[L]+nums[R]==target:res.append([nums[i], nums[j], nums[L], nums[R]])if L<R and nums[L] == nums[L+1]:L+=1if L<R and nums[R] == nums[R-1]:R-=1if nums[i]+nums[j]+nums[L]+nums[R] > target:R-=1else:L+=1return res

总是写错一些地方,修改后可以运行

class Solution:def fourSum(self, nums: List[int], target: int) -> List[List[int]]:n = len(nums)res = []nums.sort()for i in range(n):if i>0 and nums[i]==nums[i-1]:continuefor j in range(i+1, n):if j-i>1 and nums[j]==nums[j-1]:continueL = j+1R = n-1while L<R:if nums[i]+nums[j]+nums[L]+nums[R]==target:res.append([nums[i], nums[j], nums[L], nums[R]])while L<R and nums[L] == nums[L+1]:L+=1while L<R and nums[R] == nums[R-1]:R-=1L+=1R-=1elif nums[i]+nums[j]+nums[L]+nums[R] > target:  # 必须elifR-=1else:L+=1return res

官方解,加了许多优化和剪枝的方法

class Solution:def fourSum(self, nums: List[int], target: int) -> List[List[int]]:n=len(nums)if(not nums or n<4):return []nums.sort()res=[]for i in range(n-3):if(nums[i]+nums[i+1]+nums[i+2]+nums[i+3]>target):  # 第一次遍历剪枝breakif(nums[i]+nums[-1]+nums[-2]+nums[-3]<target):  # 第一次遍历剪枝,nums[-1]这里-1是指n-1continueif(i>0 and nums[i]==nums[i-1]):continuefor j in range(i+1,n-2):if(nums[i]+nums[j]+nums[j+1]+nums[j+2]>target): # 第二次遍历剪枝breakif(nums[i]+nums[j]+nums[-1]+nums[-2]<target):  # 第二次遍历剪枝continueif(j-i>1 and nums[j]==nums[j-1]):continueL=j+1R=n-1while(L<R):if(nums[i]+nums[j]+nums[L]+nums[R]==target):res.append([nums[i],nums[j],nums[L],nums[R]])while(L<R and nums[L]==nums[L+1]):L=L+1while(L<R and nums[R]==nums[R-1]):R=R-1L=L+1R=R-1elif(nums[i]+nums[j]+nums[L]+nums[R]>target):R=R-1else:L=L+1return res

http://www.ppmy.cn/news/1155370.html

相关文章

Spring framework Day15:@lmport注解使用

前言 在编程中&#xff0c;import注解通常用于导入外部的类、接口或其他资源&#xff0c;以便在当前代码文件中使用。它可以提供一种简洁、方便的方式来引入外部依赖&#xff0c;并且有以下几个主要的应用场景和好处&#xff1a; 引入外部类/接口&#xff1a;使用import注解可…

P34~36第八章相量法

8.1复数 复数可表示平面矢量、也可表示正弦量。特别是: 当复数表示正弦量的时候&#xff0c;此时复数称为相量。 8.2复数运算 复数除法也可看做乘法&#xff0c;乘法的几何意义是旋转&#xff08;辐角相加&#xff09;( e^x e^y e^xy)&#xff0c;同时伸缩&#xff08;模变…

【C++】string

string相关 这些构造函数其中常用的有&#xff1a;第一个无参构造&#xff0c;第二个拷贝构造&#xff0c;第四个字符串初始化&#xff0c;第六个使用n个字符c初始化。 其他几个构造可以了解&#xff0c;比如第三个&#xff1a;拷贝某个字符串&#xff0c;从pos位置开始拷贝&am…

XML外部实体注入攻击XXE

xml是扩展性标记语言&#xff0c;来标记数据、定义数据类型&#xff0c;是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义&#xff08;可选&#xff09;、文档元素&#xff0c;一般无法直接打开&#xff0c;可以选择用excl或记事本打…

卡尔曼家族从零解剖-(01)预备知识点

讲解关于slam一系列文章汇总链接:史上最全slam从零开始&#xff0c;针对于本栏目讲解的 卡尔曼家族从零解剖 链接 :卡尔曼家族从零解剖-(00)目录最新无死角讲解&#xff1a;https://blog.csdn.net/weixin_43013761/article/details/133846882 文末正下方中心提供了本人 联系…

codesys【手轮】

一般4线&#xff0c;也有6线 电压&#xff1a;DC5v&#xff0c;12v&#xff0c;24v 脉冲当量&#xff1a;一圈100脉&#xff0c;25脉 计数器不能【-1000】【1000】 因为一循环会多一个计数 要【-1000】【999】或者【-999】【1000】 PLC计数案例&#xff1a; // QQ750273008…

Qt creator下载安装

版本问题&#xff1a; Qt4的开发环境包括3个基本部分&#xff1a;Qt Framework&#xff08;Qt库&#xff09;、QtCreator&#xff08;IDE&#xff09;和MinGW&#xff08;编译调试&#xff09;&#xff0c;都要分别下载安装并配置&#xff0c;比较麻烦。 Qt5之后&#xff0c;…

主流接口测试框架对比

公司计划系统的开展接口自动化测试&#xff0c;需要我这边调研一下主流的接口测试框架给后端测试&#xff08;主要测试接口&#xff09;的同事介绍一下每个框架的特定和使用方式。后端同事根据他们接口的特点提出一下需求&#xff0c;看哪个框架更适合我们。 需求 1、接口编写…