本题整体的思路是:先排序,然后枚举三个下标中的某一个下标,剩下的两个下标由相向双指针确定。
枚举:本题枚举i,j,k任意一个下标都可以得到正确的答案,这里固定i,
外层循环枚举i ,接着需要在[i+1,n] 这个范围里找两个下标j,k使得num[j]+num[k]=−num[i] 。
双指针:根据上一个小节我们所学习到的双指针技巧,不难想到一种相向双指针算法:令j=i+1,k=n
三元组:在整数数组 nums 中,选取三个下标 i、j、k,若它们满足 i=j、i=k 且 j=k,则将 [nums[i],nums[j],nums[k]] 称为一个三元组。
重复三元组:如果两个三元组包含的三个整数完全相同,仅元素排列顺序可能不同,则它们被视为重复三元组。
给定整数数组 nums,请找出所有满足 nums[i]+nums[j]+nums[k]=0 的三元组,并输出这些三元组。答案中不能包含重复三元组。输出顺序以及每个三元组内部元素的顺序均不影响答案正确性。
约束条件:
输入共两行。
输出所有满足条件的三元组。每个三元组占一行,三元组内的数字之间以空格分隔。
输入
6
-2 0 1 1 2 -1
输出
-2 0 2
-2 1 1
-1 0 1
说明
数组长度为 6,数组中的数分别是 -2、0、1、1、2、-1。
选取下标 0、1、4,对应数分别是 -2、0、2,满足 −2+0+2=0,因此得到三元组 -2 0 2。
选取下标 0、2、3,对应数分别是 -2、1、1,满足 −2+1+1=0,因此得到三元组 -2 1 1。数组中虽然有两个 1,但该三元组只计一次。
选取下标 1、2、5,对应数分别是 0、1、-1,满足 0+1+(−1)=0,因此得到三元组 -1 0 1。
没有其他不同的三元组。
输入
3
0 0 0
输出
0 0 0
说明
数组长度为 3,三个数都是 0。
选取下标 0、1、2,对应数分别为 0、0、0,满足 0+0+0=0。
三个整数完全相同,因此该三元组只输出一次。
输入
5
-100000 0 100000 1 -1
输出
-100000 0 100000
-1 0 1
说明
数组长度为 5,数组中的数分别是 -100000、0、100000、1、-1。
选取下标 0、1、2,对应数分别是 -100000、0、100000,满足 −100000+0+100000=0,因此得到三元组 -100000 0 100000。
选取下标 1、3、4,对应数分别是 0、1、-1,满足 0+1+(−1)=0,因此得到三元组 -1 0 1。
没有其他不同的三元组。
© CodeFun2000 · 使用条款
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册