题解 | #三数之和#
三数之和
https://www.nowcoder.com/practice/345e2ed5f81d4017bbb8cc6055b0b711
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param num int整型一维数组 * @return int整型ArrayList<ArrayList<>> */ public ArrayList<ArrayList<Integer>> threeSum (int[] num) { // 先排序 Arrays.sort(num); ArrayList<ArrayList<Integer>> res = new ArrayList<>(); for (int i = 0; i < num.length; i++) { // 相同的数已判断过,直接跳过 if (i > 0 && num[i] == num[i - 1]) { continue; } // 以O(n)时间复杂度计算两数之和,双指针 int target = 0 - num[i]; int left = i + 1; int right = num.length - 1; while (left < right) { // 相同数已判断过,跳过 if (left > i + 1 && num[left] == num[left - 1]) { left++; continue; } if (right < num.length - 1 && num[right] == num[right + 1]) { right--; continue; } int sum = num[left] + num[right]; // 找到一个答案 if (sum == target) { ArrayList<Integer> ans = new ArrayList<>(); ans.add(num[i]); ans.add(num[left]); ans.add(num[right]); res.add(ans); left++; continue; } // 如果和比目标小,右移左指针,否做左移右指针 if (sum < target) { left++; }else { right--; } } } return res; } }