本文共 2365 字,大约阅读时间需要 7 分钟。
三数之和问题分为两个部分:判断是否存在三个数之和为零,以及找到和目标最接近的三数之和。以下是详细的解决方案和代码实现。
import java.util.ArrayList;import java.util.List;public class Solution { public List > threeSum(int[] nums) { List > result = new ArrayList<>(); if (nums == null || nums.length < 3) { return result; } Arrays.sort(nums); List > tempResult = new ArrayList<>(); for (int i = 0; i < nums.length - 2; i++) { List current = new ArrayList<>(); current.add(nums[i]); int j = i + 1; int k = nums.length - 1; while (j < k) { int sum = nums[i] + nums[j] + nums[k]; if (sum == 0) { current.add(nums[j]); current.add(nums[k]); tempResult.add(current); // 跳过重复的元素 while (j < k && nums[j] == nums[j + 1]) { j++; } while (k > j && nums[k] == nums[k - 1]) { k--; } j++; k--; } else if (sum > 0) { k--; } else { j++; } } } // 去除重复的三元组 for (List list : tempResult) { result.add(list); } return result; }}
public class Solution { public int threeSumClosest(int[] nums, int target) { if (nums == null || nums.length < 3) { return -1; } Arrays.sort(nums); int closest = nums[0] + nums[1] + nums[2]; int len = nums.length; for (int i = 0; i < len - 2; i++) { int j = i + 1; int k = len - 1; while (j < k) { int sum = nums[i] + nums[j] + nums[k]; int diff = Math.abs(sum - target); int currentDiff = Math.abs(closest - target); if (diff < currentDiff) { closest = sum; } else if (diff == currentDiff) { closest = Math.max(closest, sum); } if (sum < target) { j++; } else if (sum > target) { k--; } else { return sum; } } } return closest; }} 通过对数组排序和双指针遍历的方法,我们能够高效地解决这两个问题。首先,排序数组帮助我们快速定位可能的三元组,双指针则有效地减少了搜索空间。同时,我们记录了所有满足条件的三元组,确保结果的准确性和唯一性。在处理最接近目标值的问题时,我们在遍历过程中动态地更新最接近值,保证了算法的高效性。
转载地址:http://bcvp.baihongyu.com/