题目描述:给定一个整型数组,取任意3个数,只要它们的和满足等于0这个条件就输出出来
题目分析:首先对这个整形数组进行排序,做这样的题一般是先进行排序,然后再进行搜索
所以一共有两大步:1.排序2.搜索
首先要进行解释一下,排序之后,数组中的元素是按从小到大的顺序排列起来的,在算法中,我们定义了三个指针,头指针start,尾指针end
游标遍历指针i(自己起的名字);介绍一下start、i、end的取值吧,首先i被初始化为0,所以start肯定从第一位开始,而end = n-1;do 循环体;while(条件);它的语
法是先执行循环体,然后再判断条件是否成立。在end和start变化的同时会引起sum值的变化,同时触发判断条件进行判断进入相应的循环体。
核心思想:游标指针不动,头指针和尾指针进行移动,遍历所有等于0的情况
之后游标指针指向下一个,头指针和尾指针进行移动,遍历所有等于0的情况,
这是最核心的思想。
import java.util.*;
public class Solution{
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> result = new ArrayList<>();
int n = nums.length;
if(n < 3) return result;
Arrays.sort(nums);
int i = 0;
while(i < n - 2)
{
int start = i + 1, end = n - 1;
while(start < end)
{
int sum = nums[i] + nums[start] + nums[end];
if(sum == 0)
{
result.add(Arrays.asList(nums[i], nums[start], nums[end]));
do
{
end--;
}while(end > start && nums[end] == nums[end + 1]);
do
{
start++;
}while(start < end && nums[start] == nums[start - 1]);
}
else if(sum > 0)
{
do
{
end--;
}while(end > start && nums[end] == nums[end + 1]);
}
else
{
do
{
start++;
}while(start < end && nums[start] == nums[start - 1]);
}
}
do
{
i++;
}while(i < n - 2 && nums[i] == nums[i - 1]);
}
return result;
}
}