刷题力扣第15题-三数之和
发布时间:2022-10-03 05:31:26 405
相关标签:
题目
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。 注意: 答案中不可以包含重复的三元组。 示例: 给定数组 nums = [-1, 0, 1, 2, -1, -4], 满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ]
思路
这道题的重点是选取数组中的三个元素组成三元组,这是其一;三元组不可重复,这是其二。
《代码随想录》上用的方法是双指针法,也就是说先对数组进行排序,这个就需要借用java里的库函数来操作,排序之后,对数组进行从头到尾的遍历,如下图:
如果当nums[i]>0, 肯定组不成三元组,毕竟这是经过排序的,如果下标为i的元素都大于0,后面的元素肯定都大于0;然后我们就去对nums[i]这个元素进行去重,为什么用nums[i] == nums[i-1]来判断有没有重复,而不是nums[i] == nums[i+1]呢,因为考虑到我们数组里的元素有可能重复,前者是判断下标不重复的方法。
后面我们来对left和right进行定义,这样所谓的a+b+c = 0 就可以转变成nums[i] + nums[left] + nums[right] = 0的式子。
再对 nums[left] 和 nums[right] 进行去重即可。
class Solution {
public List> threeSum(int[] nums) {
List> result = new ArrayList<>(); //存放三元组的结果集
Arrays.sort(nums); //对数组进行排序
for(int i = 0; i < nums.length; i++){ //对元素a进行遍历
if(nums[i] > 0){
return result;
}
if(i > 0 && nums[i] == nums[i-1]){ //a 的去重
continue;
}
int left = i+1; //元素b
int right = nums.length-1; //元素c
while(right > left){
int sum = nums[i] + nums[left] + nums[right];
if(sum > 0){
right--;
}else if(sum < 0){
left++;
}else{
result.add(Arrays.asList(nums[i], nums[left], nums[right])); //收获一组结果集
while(right > left && nums[right] == nums[right - 1]) right--; // b的去重
while(right > left && nums[left] == nums[left + 1]) left++; // c的去重
right--;
left++;
}
}
}
return result;
}
}
文章来源: https://blog.51cto.com/u_15505301/5622670
特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报