算法题之三数之和问题
题目描述
题目分析
方式2:图解
最后得到结果集:
java代码
方式1:dfs遍历
public List
<List
<Integer>> threeSum(int[] nums
) {
Arrays
.sort(nums
);
List
<List
<Integer>> res
= new ArrayList<>();
List
<Integer> sub
= new ArrayList<>();
findThreeSum(0,nums
,res
,sub
,0);
return res
;
}
private void findThreeSum(int start
, int[] nums
, List
<List
<Integer>> res
, List
<Integer> sub
,int target
) {
if (sub
.size() == 3 && target
== 0) {
if (!res
.contains(sub
)) {
res
.add(new ArrayList<>(sub
));
}
return;
}
if (sub
.size() > 0 && sub
.get(0) > 0) {
return;
}
for (int i
= start
; i
< nums
.length
; i
++) {
sub
.add(nums
[i
]);
findThreeSum(i
+ 1,nums
,res
,sub
,target
- nums
[i
]);
sub
.remove(sub
.size() - 1);
}
}
方式2:排序+双指针
public List
<List
<Integer>> threeSum(int[] nums
) {
List
<List
<Integer>> res
= new ArrayList<>();
int len
= nums
.length
;
if(nums
== null
|| len
< 3) {
return res
;
}
Arrays
.sort(nums
);
for (int i
= 0; i
< len
; i
++) {
if (nums
[i
] > 0) {
break;
}
if(i
> 0 && nums
[i
] == nums
[i
-1]) {
continue;
}
int left
= i
+ 1;
int right
= len
- 1;
while (left
< right
) {
int sum
= nums
[i
] + nums
[left
] + nums
[right
];
if (sum
== 0) {
res
.add(Arrays
.asList(nums
[i
],nums
[left
],nums
[right
]));
while (left
< right
&& nums
[left
] == nums
[left
+ 1]) {left
++;}
while (left
< right
&& nums
[right
] == nums
[right
- 1]) {right
--;}
left
++;
right
--;
}else if (sum
< 0) {
left
++;
}else if (sum
> 0) {
right
--;
}
}
}
return res
;
}
转载请注明原文地址:https://blackberry.8miu.com/read-9400.html