线上网站制作/巩义关键词优化推广
题目描述
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例 1:
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
示例 2:
输入:nums = []
输出:[]
代码
class Solution {public List<List<Integer>> threeSum(int[] nums) {Arrays.sort(nums);//排序Map<Integer,Integer> hashmap=new HashMap<>();List<List<Integer>> res=new ArrayList<>();//用来存放满足的元素int length=nums.length;if(length<3) return new ArrayList<>();for(int i=0;i<length;i++){hashmap.put(nums[i],i);}Integer t;int target=0;//目标值:三个数之和0for(int i=0;i<length;i++){target=-nums[i];//将每次遍历到的数设置为目标值,寻找其余两数之和等于目标值target,由于三个数之和为0,所以目标值为-nums[i]if(i>0&&nums[i]==nums[i-1]) continue;//去掉重复的值,由于已经是排序了,而且是从头开始遍历的,所以在每次遍历的时候可以通过nums[i]==nums[i-1]来判断是否已经遍历过该数for(int j=i+1;j<length;j++){if(j>i+1&&nums[j]==nums[j-1]) continue;if((t=hashmap.get(target-nums[j]))!=null){//可以找到if(t>j){//由于数组nums排序之后,下标就固定熬了,所以为了重复,通过下标来控制答案的重复res.add(Arrays.asList(nums[i],nums[j],nums[t]));//asList()方法为数组中的方法,为:返回指定数组支持的固定大小的列表}else {break;}}}}return res;}
}