1.题目来源
力扣15题:给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
链接:https://leetcode-cn.com/problems/3sum/
2.解题思路
a.这个题目的重点在于不重复,凡是要求不重复的题目,都可以使用先排序,Array.sort()大法真好用,嘻嘻。然后按照顺序一个个来的方法,这样就不会有重复的组合了。
b.首先找出第一个数,然后剩下两个数之和就是第一个的相反数。基于此,剩下两个数的寻找可以使用寻找两数之和为固定数的算法。
c.寻找两数之和为固定数可以先排序,然后用双指针找。
d.也就是在数组中要找到3个数,这个3个数之间可以重复,但是每一个的取值不能重复。
3.代码展示
public class Solution { public static List<List<Integer>> threeSum(int[] nums) { int numLength = nums.length; List<List<Integer>> result = new ArrayList<>(); if (numLength == 0) { return result; } // 1.排序 Arrays.sort(nums); for (int first = 0; first < numLength; ++first) { // 第一个数只能取一次,所以不能和上一个相等 if (first > 0 && nums[first] == nums[first - 1]) continue; int third = numLength - 1; int target = -nums[first]; for (int second = first + 1; second < numLength; ++second) { // 第二个数也只能取一次,所以不能和上一个相等,second > first + 1是因为是每一位数的取值不相同,但是不同位数之间可以相同 if (second > first + 1 && nums[second] == nums[second - 1]) continue; // second和third还没相遇,并且两数之和大于目标值,让third减小以寻找目标值 while (second < third && nums[second] + nums[third] > target) { third--; } // 两个指针都相遇了仍然比目标值大,说明找不到那个数 if (second == third) { break; } // 寻找到对应的数字和为目标值 if (nums[second] + nums[third] == target) { List<Integer> template = new ArrayList<>(); template.add(nums[first]); template.add(nums[second]); template.add(nums[third]); result.add(template); } } } return result; } public static void main(String[] args) { int[] array = {-1, 0, 1, 2, -1, -4}; List<List<Integer>> result = threeSum(array); System.out.println(result); } }
写完代码写用例要写多个,除了题目中给出的,至少要加上特殊值用例,如:空数组