15. 三数之和
题意:给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
解题思路
解法1:
1.分析题意,三层for循环部分,需要优化,暴力解法超时
2.已排序+双指针+重合判断,解决超时问题
3.两个指针重合,代表随着b的后推,不会再有满足条件的值,因为此时nums是从小到大排序的
4.需要解决重复元素的问题,转化为如何解决重复元素问题
解题遇到的问题
无
后续需要总结学习的知识点
无
##解法1
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
class Solution {
public static List<List<Integer>> threeSum(int[] nums) {
// 结果链表
List<List<Integer>> result = new ArrayList<List<Integer>>();
if (nums.length <= 2) {
return result;
}
Arrays.sort(nums);
// a+b+c=0
HashSet<String> set = new HashSet<String>();
// 三层for循环部分,需要优化,暴力解法超时
// 已排序+双指针+重合判断,解决超时问题
for (int i = 0; i < nums.length; i++) {
for (int j = i + 1; j < nums.length; j++) {
int target = -nums[i];
int k = nums.length - 1;
while (nums[j] + nums[k] > target && j < k) {
k--;
}
// 两个指针重合,代表随着b的后推,不会再有满足条件的值,因为此时nums是从小到大排序的
if (j == k) {
break;
}
if (nums[k] + nums[j] + nums[i] == 0) {
StringBuilder builder = new StringBuilder();
// 需要解决重复元素的问题,转化为如何解决重复元素问题
int[] temp = new int[]{nums[i], nums[j], nums[k]};
Arrays.sort(temp);
builder.append(temp[0]).append(temp[1]).append(temp[2]);
if (set.add(builder.toString())) {
List<Integer> t = new ArrayList<Integer>();
t.add(nums[i]);
t.add(nums[j]);
t.add(nums[k]);
result.add(t);
}
}
}
}
return result;
}
}
网友评论